/* Copyright (C) 2014 InfiniDB, Inc.
   Copyright (C) 2016 MariaDB Corporation

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; version 2 of
   the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   MA 02110-1301, USA. */


/******************************************************************************************
 * $Id: mcsadmin.cpp 3110 2013-06-20 18:09:12Z dhill $
 *
 ******************************************************************************************/

#include <clocale>
#include <netdb.h>
extern int h_errno;

#include "columnstoreversion.h"
#include "mcsadmin.h"
#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include "boost/scoped_ptr.hpp"
#include "boost/tokenizer.hpp"
#include "sessionmanager.h"
#include "dbrm.h"
#include "messagequeue.h"
#include "we_messages.h"
#include "../../writeengine/redistribute/we_redistributedef.h"
#include "we_config.h" // for findObjectFile
#include "we_fileop.h" // for findObjectFile
namespace fs = boost::filesystem;

using namespace alarmmanager;
using namespace std;
using namespace oam;
using namespace config;
using namespace messageqcpp;
using namespace redistribute;
using namespace execplan;

#include "installdir.h"

// Variables shared in both main and functions

Config* fConfig = 0;
string Section;
int CmdID = 0;
string CmdList[cmdNum];
int CmdListID[cmdNum];
string cmdName;
const string SECTION_NAME = "Cmd";
int serverInstallType;
string systemName;
string parentOAMModule;
string localModule;
bool rootUser = true;
string HOME = "/root";
string SingleServerInstall;
string tmpDir;
string installDir;

bool repeatStop;

static void checkPromptThread();
bool connectToDBRoot1PM(Oam& oam, boost::scoped_ptr<MessageQueueClient>&  msgQueueClient);
bool SendToWES(Oam& oam, ByteStream bs);

bool waitForActive()
{
    Oam oam;

    try
    {
        oam.waitForActive();
        return true;
    }
    catch (...)
    {}

    return false;
}

bool waitForStop()
{
    Oam oam;
    SystemStatus systemstatus;
    SystemProcessStatus systemprocessstatus;

    for (int i = 0 ; i < 1200 ; i ++)
    {
        sleep (3);

        try
        {
            oam.getSystemStatus(systemstatus);

            if (systemstatus.SystemOpState == MAN_OFFLINE)
            {
                return true;
            }

            if (systemstatus.SystemOpState == FAILED)
            {
                return false;
            }

            cout << "." << flush;
        }
        catch (...)
        {
            // At some point, we need to give up, ProcMgr just isn't going to respond.
            if (i > 60) // 3 minutes
            {
                cout << "ProcMgr not responding while waiting for system to start";
                break;
            }
        }
    }

    return false;
}

//------------------------------------------------------------------------------
// Signal handler to catch SIGTERM signal to terminate the process
//------------------------------------------------------------------------------
void handleSigTerm(int i)
{
    std::cout << "Received SIGTERM to terminate MariaDB ColumnStore Console..." << std::endl;

}

//------------------------------------------------------------------------------
// Signal handler to catch Control-C signal to terminate the process
//------------------------------------------------------------------------------
void handleControlC(int i)
{
    std::cout << "Received Control-C to terminate the console..." << std::endl;
    exit(0);
}

//------------------------------------------------------------------------------
// Initialize signal handling
//------------------------------------------------------------------------------
void setupSignalHandlers()
{
#ifdef _MSC_VER
    //FIXME
#else
    // Control-C signal to terminate a command
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_handler = handleControlC;
    sigaction(SIGINT, &act, 0);

    // catch SIGTERM signal to terminate the program
//    memset(&act, 0, sizeof(act));
//    act.sa_handler = handleSigTerm;
//    sigaction(SIGTERM, &act, 0);
#endif
}

int main(int argc, char* argv[])
{
#ifndef _MSC_VER
    setuid(0); // set effective ID to root; ignore return status
#endif
    setlocale(LC_ALL, "");

    Oam oam;
    char* pcommand = 0;
    string arguments[ArgNum];

    const char* p = getenv("HOME");

    if (!p)
        p = "";
    else
        HOME = p;

    string ccHistoryFile = HOME + "/.cc_history";

    tmpDir = startup::StartUp::tmpDir();
    installDir = startup::StartUp::installDir();

    string cf = installDir + "/etc/" + ConsoleCmdsFile;
    fConfig = Config::makeConfig(cf);

//	setupSignalHandlers();

    // Get System Name
    try
    {
        oam.getSystemConfig("SystemName", systemName);
    }
    catch (...)
    {
        cout << endl << "**** Failed : Failed to read systemName Name" << endl;
        exit(-1);
    }

    //get parentModule Name
    parentOAMModule = getParentOAMModule();

    // get Local Module Name and Single Server Install Indicator
    oamModuleInfo_t st;

    try
    {
        st = oam.getModuleInfo();
        localModule = boost::get<0>(st);
        serverInstallType = boost::get<5>(st);
    }
    catch (...)
    {
        cout << endl << "**** Failed : Failed to read Local Module Name" << endl;
        exit(-1);
    }

    try
    {
        oam.getSystemConfig("SingleServerInstall", SingleServerInstall);
    }
    catch (...) {}

    //check if root-user
    int user;
    user = getuid();

    if (user != 0)
        rootUser = false;
        
    // create/open command log file if not created

    logFile.open(DEFAULT_LOG_FILE.c_str(), ios::app);

    if (geteuid() == 0 && !logFile)
    {
        cerr << "UI Command log file cannot be opened" << endl;
    }

    writeLog("Start of a command session!!!");

    // get and sort command list for future help display

    for (int i = 0; i < cmdNum ; i++)
    {
        // get cmd name

        Section = SECTION_NAME + oam.itoa(i);

        cmdName = fConfig->getConfig(Section, "Name");

        if (cmdName.empty())
            // no command skip
            continue;

        CmdList[i] = cmdName;
        CmdListID[i] = i;

        // sort

        for (int j = 0; j < i ; j++)
        {
            if ( CmdList[i] < CmdList[j] )
            {
                cmdName = CmdList[i];
                CmdList[i] = CmdList[j];
                CmdList[j] = cmdName;
                CmdID = CmdListID[i];
                CmdListID[i] = CmdListID[j];
                CmdListID[j] = CmdID;
            }
        }
    }

    if ( localModule != parentOAMModule )
    {
        // issue message informing user they aren't logged into Active OAm Parent
        cout << endl;
        cout << "WARNING: running on non Parent OAM Module, can't make configuration changes in this session." << endl;
        cout << "         Access Console from '" << parentOAMModule << "' if you need to make changes." << endl << endl;
    }

    // check for arguments passed in as a request

    if (argc > 1)
    {
        int j = 0;
        string command;

        for (; argc > 1; j++, argc--)
        {
            arguments[j] = argv[j + 1];
            command.append(arguments[j]);
            command.append(" ");
        }

        // add to history and UI command log file
        read_history(ccHistoryFile.c_str());
        add_history (command.c_str());
        writeLog(command.c_str());
        write_history(ccHistoryFile.c_str());

        checkRepeat(arguments, j);
    }
    else
    {
        cout << endl << "MariaDB ColumnStore Admin Console" << endl;
        cout << "   enter 'help' for list of commands" << endl;
        cout << "   enter 'exit' to exit the MariaDB ColumnStore Command Console" << endl;
        cout << "   use up/down arrows to recall commands" << endl << endl;

        // output current active alarm stats
        printAlarmSummary();
        printCriticalAlarms();

        //read readline history file
        read_history(ccHistoryFile.c_str());

        while (true)
        {
            //get parentModule Name
            parentOAMModule = getParentOAMModule();

            // flush agument list
            for (int j = 0; j < ArgNum; j++)
            {
                arguments[j].clear();
            }

            // read input
            pcommand = readline("mcsadmin> ");

            if (!pcommand)                        // user hit <Ctrl>-D
                pcommand = strdup("exit");

            else if (!*pcommand)
            {
                // just an enter-key was entered, ignore and reprompt
                continue;
            }

            // add to history and UI command log file
            add_history (pcommand);
            writeLog(pcommand);
            write_history(ccHistoryFile.c_str());

            string command = pcommand;

            //check if a argument was entered as a set of char with quotes around them
            int commandLoc = 0;
            int numberArgs = 0;
            bool validCMD = true;

            for (int i = 0; i < ArgNum; i++)
            {
                string::size_type pos = command.find(" ", commandLoc);
                string::size_type pos1 = command.find("\"", commandLoc);
                string::size_type pos3 = command.find("\'", commandLoc);

                if ( (pos == string::npos && pos1 == string::npos) ||
                        (pos == string::npos && pos3 == string::npos) )
                {
                    //end of the command
                    string argtemp = command.substr(commandLoc, 80);

                    if ( argtemp != "" )
                    {
                        arguments[numberArgs] = argtemp;
                        numberArgs++;
                    }

                    break;
                }

                if (pos < pos1 && pos < pos3)
                {
                    // hit ' ' first
                    string argtemp = command.substr(commandLoc, pos - commandLoc);

                    if ( argtemp != "" )
                    {
                        arguments[numberArgs] = argtemp;
                        numberArgs++;
                    }

                    commandLoc = pos + 1;
                }
                else
                {
                    if ( pos >= pos1 )
                    {
                        //hit " first
                        string::size_type pos2 = command.find("\"", pos1 + 1);

                        if (pos2 != string::npos)
                        {
                            arguments[numberArgs] = command.substr(pos1 + 1, pos2 - pos1 - 1);
                            numberArgs++;
                            commandLoc = pos2 + 1;
                        }
                        else
                        {
                            cout << "Invalid Command, mismatching use of quotes" << endl;
                            validCMD = false;
                            break;
                        }
                    }
                    else
                    {
                        //hit ' first
                        string::size_type pos2 = command.find("\'", pos3 + 1);

                        if (pos2 != string::npos)
                        {
                            arguments[numberArgs] = command.substr(pos3 + 1, pos2 - pos3 - 1);
                            numberArgs++;
                            commandLoc = pos2 + 1;
                        }
                        else
                        {
                            cout << "Invalid Command, mismatching use of quotes" << endl;
                            validCMD = false;
                            break;
                        }
                    }
                }
            }

            if (validCMD)
                checkRepeat(arguments, numberArgs);

            free (pcommand);
        }
    }
}

void checkRepeat(string* arguments, int argNumber)
{
    Oam oam;
    bool repeat = false;
    int repeatCount = 5;

    for ( int i = 0; i < argNumber ; i++)
    {
        if ( arguments[i].find("-r") == 0)
        {
            // entered
            if ( arguments[i] != "-r")
            {
                //strip report count off
                repeatCount = atoi(arguments[i].substr(2, 10).c_str());

                if ( repeatCount < 1 || repeatCount > 60 )
                {
                    cout << "Failed: incorrect repeat count entered, valid range is 1-60, set to default of 5" << endl;
                    repeatCount = 5;
                }
            }

            repeat = true;
            arguments[i].clear();
            cout << "repeating the command '" << arguments[0] << "' every " << repeatCount << " seconds, enter CTRL-D to stop" << endl;
            sleep(5);
            break;
        }
    }

    bool threadCreate = false;

    if (repeat)
    {
        while (true)
        {
            system("clear");

            if ( processCommand(arguments) )
                return;
            else
            {
                if ( !threadCreate )
                {
                    threadCreate = true;
                    repeatStop = false;
                    pthread_t PromptThread;
                    pthread_create (&PromptThread, NULL, (void* (*)(void*)) &checkPromptThread, NULL);
                }

                for ( int i = 0 ; i < repeatCount ; i ++ )
                {
                    if (repeatStop)
                        break;

                    sleep(1);
                }

                if (repeatStop)
                    break;
            }
        }
    }
    else
        processCommand(arguments);
}

int processCommand(string* arguments)
{
    Oam oam;
    // Possible command line arguments
    GRACEFUL_FLAG gracefulTemp = GRACEFUL;
    ACK_FLAG ackTemp = ACK_YES;
    CC_SUSPEND_ANSWER suspendAnswer = CANCEL;
    bool bNeedsConfirm = true;
    string password;
    string cmd;
    // get command info from Command config file
    CmdID = -1;

    // put inputted command into lowercase
    string inputCmd = arguments[0];
    transform (inputCmd.begin(), inputCmd.end(), inputCmd.begin(), to_lower());

    for (int i = 0; i < cmdNum; i++)
    {
        // put table command into lowercase
        string cmdName_LC = CmdList[i];
        transform (cmdName_LC.begin(), cmdName_LC.end(), cmdName_LC.begin(), to_lower());

        if (cmdName_LC.find(inputCmd) == 0)
        {
            // command found, ECHO command
            cout << cmdName_LC << "   " << oam.getCurrentTime() << endl;
            CmdID = CmdListID[i];
            break;
        }
    }

    if (CmdID == -1)
    {
        // get is command in the Support Command list
        for (int i = 0;; i++)
        {
            if (supportCmds[i] == "")
                // end of list
                break;

            if (supportCmds[i].find(inputCmd) == 0)
            {
                // match found, go process it
                cout << supportCmds[i] << "   " << oam.getCurrentTime() << endl;
                int status = ProcessSupportCommand(i, arguments);

                if ( status == -1 )
                    // didn't process it for some reason
                    break;

                return 1;
            }
        }

        // command not valid
        cout << arguments[0] << ": Unknown Command, type help for list of commands" << endl << endl;
        return 1;
    }

    switch ( CmdID )
    {
        case 0: // help
        case 1: // ?
        {
            const string DESC_NAME = "Desc";
            string desc;
            string descName;
            const string ARG_NAME = "Arg";
            string arg;
            string argName;

            string argument1_LC = arguments[1];
            transform (argument1_LC.begin(), argument1_LC.end(), argument1_LC.begin(), to_lower());

            if (argument1_LC.find("-a") == 0 || argument1_LC == "")
            {
                // list commands and brief description (Desc1)
                cout << endl << "List of commands:" << endl;
                cout << "Note: the command must be the first entry entered on the command line" << endl << endl;
                cout.setf(ios::left);
                cout.width(34);
                cout << "Command" << "Description" << endl;
                cout.setf(ios::left);
                cout.width(34);
                cout << "------------------------------" << "--------------------------------------------------------" << endl;

                for (int i = 0; i < cmdNum ; i++)
                {
                    // get cmd name

                    Section = SECTION_NAME + oam.itoa(CmdListID[i]);

                    cmdName = fConfig->getConfig(Section, "Name");

                    if (cmdName.empty()  || cmdName == "AVAILABLE")
                        // no command skip
                        continue;

                    cout.setf(ios::left);
                    cout.width(34);
                    cout << cmdName << fConfig->getConfig(Section, "Desc1") << endl;
                }

                cout << endl << "For help on a command, enter 'help' followed by command name" << endl;
            }
            else
            {
                if (argument1_LC.find("-v") == 0)
                {
                    // list of commands with their descriptions
                    cout << endl << "List of commands and descriptions:" << endl << endl;

                    for (int k = 0 ; k < cmdNum ; k++)
                    {
                        Section = SECTION_NAME + oam.itoa(CmdListID[k]);
                        cmdName = fConfig->getConfig(Section, "Name");

                        if (cmdName.empty()  || cmdName == "AVAILABLE")
                            //no command skip
                            continue;

                        cout << "Command: " << cmdName << endl << endl;
                        int i = 2;
                        cout << "   Description: " << fConfig->getConfig(Section, "Desc1") << endl;

                        while (true)
                        {
                            desc = DESC_NAME + oam.itoa(i);
                            descName = fConfig->getConfig(Section, desc);

                            if (descName.empty())
                                //end of Desc list
                                break;

                            cout << "                " << descName << endl;
                            i++;
                        }

                        i = 2;
                        cout << endl << "   Arguments:   " << fConfig->getConfig(Section, "Arg1") << endl;

                        while (true)
                        {
                            arg = ARG_NAME + oam.itoa(i);
                            argName = fConfig->getConfig(Section, arg);

                            if (argName.empty())
                                //end of arg list
                                break;

                            cout << "                " << argName << endl;
                            i++;
                        }

                        cout << endl;
                    }
                }
                else
                {
                    // description for a single command
                    int j = 0;

                    for (j = 0; j < cmdNum; j++)
                    {
                        // get cmd description

                        Section = SECTION_NAME + oam.itoa(j);

                        cmdName = fConfig->getConfig(Section, "Name");

                        string cmdName_LC = cmdName;
                        transform (cmdName_LC.begin(), cmdName_LC.end(), cmdName_LC.begin(), to_lower());

                        if (cmdName_LC == argument1_LC)
                        {
                            // command found, output description
                            cout << endl << "   Command:     " << cmdName << endl << endl;
                            int i = 2;
                            cout << "   Description: " << fConfig->getConfig(Section, "Desc1") << endl;

                            while (true)
                            {
                                desc = DESC_NAME + oam.itoa(i);
                                descName = fConfig->getConfig(Section, desc);

                                if (descName.empty())
                                    //end of Desc list
                                    break;

                                cout << "                " << descName << endl;
                                i++;
                            }

                            i = 2;
                            cout << endl << "   Arguments:   " << fConfig->getConfig(Section, "Arg1") << endl;

                            while (true)
                            {
                                arg = ARG_NAME + oam.itoa(i);
                                argName = fConfig->getConfig(Section, arg);

                                if (argName.empty())
                                    //end of arg list
                                    break;

                                cout << "                " << argName << endl;
                                i++;
                            }

                            break;
                        }
                    }

                    if (j == cmdNum)
                    {
                        // command not valid
                        cout << arguments[1] << ": Unknown Command, type help for list of commands" << endl << endl;
                        break;
                    }
                }
            }

            cout << endl;
        }
        break;

        case 2: // exit
        case 3: // quit
        {
            // close the log file
            writeLog("End of a command session!!!");
            logFile.close();
            cout << "Exiting the MariaDB ColumnStore Admin Console" << endl;

            exit (0);
        }
        break;

        case 4: // redistributeData
        {
            set<uint32_t> removeDbroots;    // set of dbroots we want to leave empty
            vector<uint32_t> srcDbroots;    // all of the currently configured dbroots
            vector<uint32_t> destDbroots;   // srcDbroots - removeDbroots
            set<int>::iterator dbiter;

            if (arguments[1] == "start")
            {
                // Get a list of all the configured dbroots in the xml file.
                DBRootConfigList dbRootConfigList;
                std::set<int> configuredDBRoots;
                oam.getSystemDbrootConfig(dbRootConfigList);

                for (DBRootConfigList::iterator i = dbRootConfigList.begin(); i != dbRootConfigList.end(); ++i)
                    configuredDBRoots.insert(*i);

                // The user may choose to redistribute in such a way as to
                // leave certain dbroots empty, presumably for later removal.
                if (arguments[2] == "remove")
                {
                    int dbroot;
                    bool error = false;

                    for (int i = 3; arguments[i] != ""; ++i)
                    {
                        dbroot = atoi(arguments[i].c_str());

                        if (dbroot == 1)
                        {
                            cout << "Not allowed to remove dbroot-1" << endl;
                            error = true;
                        }
                        else
                        {
                            if (configuredDBRoots.find(dbroot) == configuredDBRoots.end())
                            {
                                ostringstream oss;
                                cout << "DBRoot-" << dbroot << " is not configured" << endl;
                                error = true;
                            }
                            else
                            {
                                removeDbroots.insert((uint32_t)dbroot);
                            }
                        }
                    }

                    if (error)
                    {
                        cout << "Errors encountered. Abort" << endl;
                        break;
                    }
                }

                // Create a list of source dbroots -- where the data currently resides.
                for (dbiter = configuredDBRoots.begin(); dbiter != configuredDBRoots.end(); ++dbiter)
                    srcDbroots.push_back((uint32_t)*dbiter);

                // Create a list of destination dbroots -- where the data is to go.
                for (dbiter = configuredDBRoots.begin(); dbiter != configuredDBRoots.end(); ++dbiter)
                {
                    // Only use the dbroots not in the remove list
                    if (removeDbroots.find((uint32_t)*dbiter) == removeDbroots.end())
                    {
                        destDbroots.push_back((uint32_t)*dbiter);
                    }
                }

                // Print out what we're about to do
                cout << "redistributeData START ";

                if (removeDbroots.size() > 0)
                {
                    cout << "    Removing dbroots:";
                    set<uint32_t>::iterator iter;

                    for (iter = removeDbroots.begin(); iter != removeDbroots.end(); ++iter)
                    {
                        cout << " " << *iter;
                    }
                }

                cout << endl;
                cout << "Source dbroots:";
                vector<uint32_t>::iterator iter;

                for (iter = srcDbroots.begin(); iter != srcDbroots.end(); ++iter)
                    cout << " " << *iter;

                cout << endl << "Destination dbroots:";

                for (iter = destDbroots.begin(); iter != destDbroots.end(); ++iter)
                    cout << " " << *iter;

                cout << endl << endl;

                // Connect to PM for dbroot1
                ByteStream bs;
                // message WES ID, sequence #, action id
                uint32_t sequence = time(0);
                bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;

                // Send the CLEAR message to WriteEngineServer (WES). Wipes out previous state.
                RedistributeMsgHeader header(0, 0, sequence, RED_CNTL_CLEAR);
                bs.append((const ByteStream::byte*) &header, sizeof(header));
                SendToWES(oam, bs);

                // Send the START message
                bs.restart();
                sequence = time(0);
                bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
                header.sequenceNum = sequence;
                header.messageId = RED_CNTL_START;
                bs.append((const ByteStream::byte*) &header, sizeof(header));
                uint32_t options = 0;

                if (removeDbroots.size() > 0)
                {
                    options |= RED_OPTN_REMOVE;
                }

                bs << options;

                // source db roots,
                bs << (uint32_t) srcDbroots.size();

                for (uint64_t i = 0; i < srcDbroots.size(); ++i)
                    bs << (uint32_t) srcDbroots[i];

                // destination db roots,
                bs << (uint32_t) destDbroots.size();

                for (uint64_t i = 0; i < destDbroots.size(); ++i)
                    bs << (uint32_t) destDbroots[i];

                SendToWES(oam, bs);
            }
            else if (arguments[1] == "stop")
            {
                ByteStream bs;
                // message WES ID, sequence #, action id
                uint32_t sequence = time(0);
                bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
                RedistributeMsgHeader header(0, 0, sequence, RED_CNTL_STOP);
                bs.append((const ByteStream::byte*) &header, sizeof(header));
                SendToWES(oam, bs);
            }
            else if (arguments[1] == "status")
            {
                ByteStream bs;
                // message WES ID, sequence #, action id
                uint32_t sequence = time(0);
                bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
                RedistributeMsgHeader header(0, 0, sequence, RED_CNTL_STATUS);
                bs.append((const ByteStream::byte*) &header, sizeof(header));
                SendToWES(oam, bs);
            }
            else
            {
                cout << "redistributeData must have one of START, STOP or STATUS" << endl;
            }
        }
        break;

        case 5: // findObjectFile
        {
            unsigned maxDBRoot = WriteEngine::Config::DBRootCount();

            if (maxDBRoot < 1)
            {
                cout << endl << "findobjectfile fails because there are no dbroots defined for this server" << endl;
                break;;
            }

            if (arguments[1] == "")
            {
                cout << endl << "findobjectfile requires one of" << endl;
                cout << "a) oid of column for which file name is to be retrieved" << endl;
                cout << "b) schema, table and column for which the file name is to be retrieved" << endl;
                cout << "c) oid of table for which the file name of each column is to be retrieved" << endl;
                cout << "d) schema and table for which the file name of each column is to be retrieved" << endl;
                break;
            }

            char* endchar;
            int oid = 0;
            int tableOid = 0; // If a table report
            int dictOid = 0;  // If a dictionary oid was given
            std::vector<int> columnOids;
            CalpontSystemCatalog::TableName tableName;
            CalpontSystemCatalog::TableColName columnName;
            boost::shared_ptr<execplan::CalpontSystemCatalog> systemCatalogPtr =
                execplan::CalpontSystemCatalog::makeCalpontSystemCatalog(0);
            systemCatalogPtr->identity(execplan::CalpontSystemCatalog::FE);

            // Try to get a numeric oid from the argument
            oid = strtol(arguments[1].c_str(), &endchar, 0);

            // test to see if not all numeric
            if (endchar < & (*arguments[1].end())) // endchar from above will not point to the end if not numeric
            {
                oid = 0;
            }

            if (oid == 0)  // A table or column name was entered
            {
                // Need to convert the arguments to oid
                columnName.schema = arguments[1];

                if (arguments[2] == "")
                {
                    cout << endl << "findobjectfile requires a table for schema " << arguments[1] << endl;
                    break;
                }

                columnName.table = arguments[2];

                if (arguments[3] == "")
                {
                    // No column was given. Get the list of column oids for the table.
                    tableName.schema = arguments[1];
                    tableName.table = arguments[2];

                    try
                    {
                        tableOid = systemCatalogPtr->lookupTableOID(tableName);

                        if (tableOid)
                        {
                            CalpontSystemCatalog::RIDList rdlist = systemCatalogPtr->columnRIDs(tableName);

                            for (unsigned int i = 0; i < rdlist.size(); ++i)
                            {
                                columnOids.push_back(rdlist[i].objnum);
                            }
                        }
                        else
                        {
                            cout << arguments[1] << "." << arguments[2] << " is not a columnstore table" << endl;
                            break;
                        }
                    }
                    catch ( runtime_error& e )
                    {
                        cout << "error while trying to get the columns for " << tableName.schema << "." << tableName.table << ": " << e.what() << endl;
                        break;
                    }
                    catch (...)
                    {
                        cout << "error while trying to get the columns for " << tableName.schema << "." << tableName.table << endl;
                        break;
                    }
                }
                else // A column name was given
                {
                    columnName.column = arguments[3];
                    oid = systemCatalogPtr->lookupOID(columnName);

                    if (oid < 1)
                    {
                        cout << arguments[1] << "." << arguments[2] << "." << arguments[3] << " is not a columnstore column" << endl;
                        break;
                    }

                    columnOids.push_back(oid);
                }
            }
            else // An oid was given
            {
                try
                {
                    // Is oid a column?
                    columnName = systemCatalogPtr->colName(oid);
                }
                catch (...) { /* Ignore */ }

                if (columnName.schema.size() == 0 || columnName.table.size() == 0 || columnName.column.size() == 0)
                {
                    // Not a column OID
                    // check to see if it's a dictionary oid.
                    try
                    {
                        columnName = systemCatalogPtr->dictColName(oid);
                    }
                    catch (...) { /* Ignore */ }

                    if (columnName.schema.size() == 0 || columnName.table.size() == 0 || columnName.column.size() == 0)
                    {
                        // Not a dictionary oid
                        // Check to see if a table oid was given. If so, get the column oid list.
                        try
                        {
                            tableName = systemCatalogPtr->tableName(oid);
                        }
                        catch (...) { /* Ignore */ }

                        if (tableName.schema.size() == 0 || tableName.table.size() == 0)
                        {
                            // Not a table or a column OID.
                            cout << "OID " << oid << " does not represent a table or column in columnstore" << endl;
                            break;
                        }

                        tableOid = oid;

                        try
                        {
                            CalpontSystemCatalog::RIDList rdlist = systemCatalogPtr->columnRIDs(tableName);

                            for (unsigned int i = 0; i < rdlist.size(); ++i)
                            {
                                columnOids.push_back(rdlist[i].objnum);
                            }
                        }
                        catch (...) { /* Ignore */ }
                    }
                    else
                    {
                        // This is a dictionary oid
                        dictOid = oid;
                        columnOids.push_back(oid);
                    }
                }
                else
                {
                    // This is a column oid
                    columnOids.push_back(oid);
                }
            }

            // Use writeengine code to get the filenames
            WriteEngine::FileOp fileOp;
            char fileName[WriteEngine::FILE_NAME_SIZE];
            memset(fileName, 0, WriteEngine::FILE_NAME_SIZE);
            int rc;

            if (tableOid)
            {
                cout << "for table OID " << tableOid << " "
                     << tableName.schema << "." << tableName.table << ":" << endl;
            }

            for (unsigned int i = 0; i < columnOids.size(); ++i)
            {
                oid = columnOids[i];

                if (oid < 1000)
                {
                    rc = fileOp.getVBFileName(oid, fileName);
                }
                else
                {
                    rc = fileOp.oid2DirName(oid, fileName);
                }

                if (oid == dictOid)
                {
                    columnName = systemCatalogPtr->dictColName(oid);
                    cout << "dictionary OID " << oid << " ";
                }
                else
                {
                    columnName = systemCatalogPtr->colName(oid);
                    cout << "column OID " << oid << " ";
                }

                if (!tableOid)
                {
                    cout << columnName.schema << "." << columnName.table << ".";
                }

                cout << columnName.column << "\t";

                if (strlen(fileName) > 0)
                {
                    cout << fileName;
                }

                if (rc == WriteEngine::NO_ERROR)
                {
                    // Success. No more output.
                    cout << endl;
                }
                else if (rc == WriteEngine::ERR_FILE_NOT_EXIST)
                {
                    if (strlen(fileName) == 0)
                    {
                        // We couldn't get a name
                        cout << "Error: Filename could not be determined" << endl;
                    }
                    else
                    {
                        // We got a name, but the file doesn't exist
                        cout << " (directory does not exist on this server)" << endl;
                    }
                }
                else
                {
                    // Something broke
                    cerr << "WriteEngine::FileOp::oid2DirName() error. rc=" << rc << endl;
                }
            }
        }
        break;

        case 6: // getModuleTypeConfig
        {
            SystemModuleTypeConfig systemmoduletypeconfig;
            ModuleTypeConfig moduletypeconfig;
            ModuleConfig moduleconfig;
            systemmoduletypeconfig.moduletypeconfig.clear();
            string returnValue;
            string Argument;

            if (arguments[1] == "all" || arguments[1] == "")
            {

                // get and all display Module config parameters

                try
                {
                    oam.getSystemConfig(systemmoduletypeconfig);

                    cout << endl << "Module Type Configuration" << endl << endl;

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                            // end of list
                            break;

                        int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                        if ( moduleCount < 1 )
                            continue;

                        string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
                        cout << "ModuleType '" << moduletype	<< "' Configuration information" << endl << endl;

                        cout << "ModuleDesc = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc << endl;
                        cout << "RunType = " << systemmoduletypeconfig.moduletypeconfig[i].RunType << endl;
                        cout << "ModuleCount = " << moduleCount << endl;

                        if ( moduleCount > 0 )
                        {
                            DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                            for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                            {
                                string modulename = (*pt).DeviceName;
                                HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                                for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                                {
                                    string ipAddr = (*pt1).IPAddr;
                                    string servername = (*pt1).HostName;
                                    cout << "ModuleHostName and ModuleIPAddr for NIC ID " + oam.itoa((*pt1).NicID) + " on  module '" << modulename << "' = " << servername  << " , " << ipAddr << endl;
                                }
                            }
                        }

                        DeviceDBRootList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.begin();

                        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.end() ; pt++)
                        {
                            if ( (*pt).dbrootConfigList.size() > 0 )
                            {
                                cout << "DBRootIDs assigned to module 'pm" << (*pt).DeviceID << "' = ";
                                DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();

                                for ( ; pt1 != (*pt).dbrootConfigList.end() ; )
                                {
                                    cout << *pt1;
                                    pt1++;

                                    if (pt1 != (*pt).dbrootConfigList.end())
                                        cout << ", ";
                                }
                            }

                            cout << endl;
                        }

                        cout << "ModuleCPUCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUCriticalThreshold << endl;
                        cout << "ModuleCPUMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUMajorThreshold << endl;
                        cout << "ModuleCPUMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUMinorThreshold << endl;
                        cout << "ModuleCPUMinorClearThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUMinorClearThreshold << endl;
                        cout << "ModuleDiskCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDiskCriticalThreshold << endl;
                        cout << "ModuleDiskMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDiskMajorThreshold << endl;
                        cout << "ModuleDiskMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDiskMinorThreshold << endl;
                        cout << "ModuleMemCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleMemCriticalThreshold << endl;
                        cout << "ModuleMemMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleMemMajorThreshold << endl;
                        cout << "ModuleMemMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleMemMinorThreshold << endl;
                        cout << "ModuleSwapCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleSwapCriticalThreshold << endl;
                        cout << "ModuleSwapMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleSwapMajorThreshold << endl;
                        cout << "ModuleSwapMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleSwapMinorThreshold << endl;

                        DiskMonitorFileSystems::iterator pt2 = systemmoduletypeconfig.moduletypeconfig[i].FileSystems.begin();
                        int id = 1;

                        for ( ; pt2 != systemmoduletypeconfig.moduletypeconfig[i].FileSystems.end() ; pt2++)
                        {
                            string fs = *pt2;
                            cout << "ModuleDiskMonitorFileSystem#" << id << " = " << fs << endl;
                            ++id;
                        }

                        cout << endl;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** getModuleTypeConfig Failed =  " << e.what() << endl;
                }
            }
            else
            {
                // get a single module type config
                if (arguments[2] == "")
                {
                    try
                    {
                        oam.getSystemConfig(arguments[1], moduletypeconfig);

                        cout << endl << "Module Type Configuration for " << arguments[1] << endl << endl;

                        int moduleCount = moduletypeconfig.ModuleCount;
                        string moduletype = moduletypeconfig.ModuleType;

                        cout << "ModuleDesc = " << moduletypeconfig.ModuleDesc << endl;
                        cout << "ModuleCount = " << moduleCount << endl;
                        cout << "RunType = " << moduletypeconfig.RunType << endl;

                        if ( moduleCount > 0 )
                        {
                            DeviceNetworkList::iterator pt = moduletypeconfig.ModuleNetworkList.begin();

                            for ( ; pt != moduletypeconfig.ModuleNetworkList.end() ; pt++)
                            {
                                string modulename = (*pt).DeviceName;
                                HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                                for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                                {
                                    string ipAddr = (*pt1).IPAddr;
                                    string servername = (*pt1).HostName;
                                    cout << "ModuleHostName and ModuleIPAddr for NIC ID " + oam.itoa((*pt1).NicID) + " on  module " << modulename << " = " << servername  << " , " << ipAddr << endl;
                                }
                            }
                        }

                        int dbrootCount = moduletypeconfig.ModuleDBRootList.size();

                        cout << "DBRootCount = " << dbrootCount << endl;

                        if ( dbrootCount > 0 )
                        {
                            DeviceDBRootList::iterator pt = moduletypeconfig.ModuleDBRootList.begin();

                            for ( ; pt != moduletypeconfig.ModuleDBRootList.end() ; pt++)
                            {
                                cout << "DBRoot IDs assigned to 'pm" + oam.itoa((*pt).DeviceID) + "' = ";

                                DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();

                                for ( ; pt1 != (*pt).dbrootConfigList.end() ; )
                                {
                                    cout << *pt1;
                                    pt1++;

                                    if (pt1 != (*pt).dbrootConfigList.end())
                                        cout << ", ";
                                }

                                cout << endl;
                            }
                        }

                        cout << "ModuleCPUCriticalThreshold % = " << moduletypeconfig.ModuleCPUCriticalThreshold << endl;
                        cout << "ModuleCPUMajorThreshold % = " << moduletypeconfig.ModuleCPUMajorThreshold << endl;
                        cout << "ModuleCPUMinorThreshold % = " << moduletypeconfig.ModuleCPUMinorThreshold << endl;
                        cout << "ModuleCPUMinorClearThreshold % = " << moduletypeconfig.ModuleCPUMinorClearThreshold << endl;
                        cout << "ModuleDiskCriticalThreshold % = " << moduletypeconfig.ModuleDiskCriticalThreshold << endl;
                        cout << "ModuleDiskMajorThreshold % = " << moduletypeconfig.ModuleDiskMajorThreshold << endl;
                        cout << "ModuleDiskMinorThreshold % = " << moduletypeconfig.ModuleDiskMinorThreshold << endl;
                        cout << "ModuleMemCriticalThreshold % = " << moduletypeconfig.ModuleMemCriticalThreshold << endl;
                        cout << "ModuleMemMajorThreshold % = " << moduletypeconfig.ModuleMemMajorThreshold << endl;
                        cout << "ModuleMemMinorThreshold % = " << moduletypeconfig.ModuleMemMinorThreshold << endl;
                        cout << "ModuleSwapCriticalThreshold % = " << moduletypeconfig.ModuleSwapCriticalThreshold << endl;
                        cout << "ModuleSwapMajorThreshold % = " << moduletypeconfig.ModuleSwapMajorThreshold << endl;
                        cout << "ModuleSwapMinorThreshold % = " << moduletypeconfig.ModuleSwapMinorThreshold << endl;

                        DiskMonitorFileSystems::iterator pt = moduletypeconfig.FileSystems.begin();
                        int id = 1;

                        for ( ; pt != moduletypeconfig.FileSystems.end() ; pt++)
                        {
                            string fs = *pt;
                            cout << "ModuleDiskMonitorFileSystem#" << id << " = " << fs << endl;
                            ++id;
                        }

                        cout << endl;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getModuleTypeConfig Failed =  " << e.what() << endl;
                    }
                }
                else
                {
                    // get a parameter for a module type
                    try
                    {
                        oam.getSystemConfig(systemmoduletypeconfig);
                    }
                    catch (...)
                    {}

                    unsigned int i = 0;

                    for ( i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType == arguments[1])
                        {
                            string argument2 = arguments[2];
                            string::size_type pos = arguments[2].rfind("#", 200);

                            if (pos != string::npos)
                            {
                                string ID = arguments[2].substr(pos + 1, 5);
                                arguments[2] = arguments[2].substr(0, pos);
                                arguments[2] = arguments[2] + ID + "-";
                            }

                            Argument = arguments[2] + oam.itoa(i + 1);

                            try
                            {
                                oam.getSystemConfig(Argument, returnValue);
                                cout << endl << "   " << argument2 << " = " << returnValue << endl << endl;
                                break;
                            }
                            catch (exception& e)
                            {
                                cout << endl << "**** getModuleTypeConfig Failed =  " << e.what() << endl;
                                break;
                            }
                        }
                    }

                    if ( i == systemmoduletypeconfig.moduletypeconfig.size() )
                    {
                        // module type not found
                        cout << endl << "**** getModuleTypeConfig Failed : Invalid Module Type" << endl;
                        break;
                    }
                }
            }
        }
        break;

        case 7: // setModuleTypeConfig - parameters: Module type, Parameter name and value
        {
            SystemModuleTypeConfig systemmoduletypeconfig;
            ModuleTypeConfig moduletypeconfig;
            string Argument;

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** setModuleTypeConfig Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[3] == "")
            {
                // need 3 arguments
                cout << endl << "**** setModuleTypeConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            if ( arguments[3] == "=" )
            {
                cout << endl << "**** setModuleTypeConfig Failed : Invalid Value of '=', please re-enter" << endl;
                break;
            }

            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);
            }
            catch (...)
            {}

            unsigned int i = 0;

            for ( i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
            {
                if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType == arguments[1])
                {
                    string argument2 = arguments[2];
                    string::size_type pos = arguments[2].rfind("#", 200);

                    if (pos != string::npos)
                    {
                        string ID = arguments[2].substr(pos + 1, 5);
                        arguments[2] = arguments[2].substr(0, pos);
                        arguments[2] = arguments[2] + ID + "-";
                    }

                    Argument = arguments[2] + oam.itoa(i + 1);

                    try
                    {
                        oam.setSystemConfig(Argument, arguments[3]);
                        cout << endl << "   Successfully set " << argument2 << " = " << arguments[3] << endl << endl;
                        break;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** setModuleTypeConfig Failed =  " << e.what() << endl;
                        break;
                    }
                }
            }

            if ( i == systemmoduletypeconfig.moduletypeconfig.size() )
            {
                // module type not found
                cout << endl << "**** setModuleTypeConfig Failed : Invalid Module Type" << endl;
                break;
            }
        }
        break;

        case 8: // getProcessConfig
        {
            SystemProcessConfig systemprocessconfig;
            ProcessConfig processconfig;
            string returnValue;

            if (arguments[1] == "all" || arguments[1] == "")
            {
                // get and all display Process config parameters

                try
                {
                    oam.getProcessConfig(systemprocessconfig);

                    cout << endl << "Process Configuration" << endl << endl;

                    for ( unsigned int i = 0 ; i < systemprocessconfig.processconfig.size(); i++)
                    {
                        cout << "Process #" << i + 1 << " Configuration information" << endl;

                        cout << "ProcessName = " << systemprocessconfig.processconfig[i].ProcessName  << endl;
                        cout << "ModuleType = " << systemprocessconfig.processconfig[i].ModuleType << endl;
                        cout << "ProcessLocation = " << systemprocessconfig.processconfig[i].ProcessLocation << endl;

                        for ( int j = 0 ; j < oam::MAX_ARGUMENTS; j++)
                        {
                            if (systemprocessconfig.processconfig[i].ProcessArgs[j].empty())
                                break;

                            cout << "ProcessArg" << j + 1 << " = " << systemprocessconfig.processconfig[i].ProcessArgs[j] << endl;
                        }

                        cout << "BootLaunch = " << systemprocessconfig.processconfig[i].BootLaunch << endl;
                        cout << "LaunchID = " << systemprocessconfig.processconfig[i].LaunchID << endl;

                        for ( int j = 0 ; j < MAX_DEPENDANCY; j++)
                        {
                            if (systemprocessconfig.processconfig[i].DepProcessName[j].empty())
                                break;

                            cout << "DepModuleName" << j + 1 << " = " << systemprocessconfig.processconfig[i].DepModuleName[j] << endl;
                            cout << "DepProcessName" << j + 1 << " = " << systemprocessconfig.processconfig[i].DepProcessName[j] << endl;
                        }

                        // display Process Group variables, if they exist

                        cout << "RunType = " << systemprocessconfig.processconfig[i].RunType << endl;
                        cout << "LogFile = " << systemprocessconfig.processconfig[i].LogFile << endl;

                        cout << endl;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** getProcessConfig Failed =  " << e.what() << endl;
                }
            }
            else
            {
                // get a single process info - parameters: module-name, process-name
                if (arguments[2] == "")
                {
                    cout << endl << "**** getProcessConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                    break;
                }

                if (arguments[3] == "")
                {
                    //**** Add API to get single process info
                    try
                    {
                        oam.getProcessConfig(arguments[1], arguments[2], processconfig);

                        cout << endl << "Process Configuration for " << arguments[1] << " on module " << arguments[2] << endl << endl;

                        cout << "ProcessName = " << processconfig.ProcessName  << endl;
                        cout << "ModuleType = " << processconfig.ModuleType << endl;
                        cout << "ProcessLocation = " << processconfig.ProcessLocation  << endl;

                        for ( int j = 0 ; j < oam::MAX_ARGUMENTS; j++)
                        {
                            if (processconfig.ProcessArgs[j].empty())
                                break;

                            cout << "ProcessArg" << j + 1 << " = " << processconfig.ProcessArgs[j] << endl;
                        }

                        cout << "BootLaunch = " << processconfig.BootLaunch << endl;
                        cout << "LaunchID = " << processconfig.LaunchID << endl;

                        for ( int j = 0 ; j < MAX_DEPENDANCY; j++)
                        {
                            if (processconfig.DepProcessName[j].empty())
                                break;

                            cout << "DepProcessName" << j + 1 << " = " << processconfig.DepProcessName[j] << endl;
                            cout << "DepModuleName" << j + 1 << " = " << processconfig.DepModuleName[j] << endl;
                        }

                        cout << "RunType = " << processconfig.RunType << endl;
                        cout << "LogFile = " << processconfig.LogFile << endl;

                        cout << endl;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getProcessConfig Failed =  " << e.what() << endl;
                    }
                }
                else
                {
                    // get a parameter for a process - parameters: module-name, process-name,
                    // parameter-name
                    // get module ID from module name entered, then get parameter
                    try
                    {
                        oam.getProcessConfig(arguments[1], arguments[2], arguments[3], returnValue);
                        cout << endl << "   " << arguments[3] << " = " << returnValue << endl << endl;
                        break;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getProcessConfig Failed =  " << e.what() << endl;
                        break;
                    }
                }
            }
        }
        break;

        case 9: // setProcessConfig - parameters: Module name, Process Name, Parameter name and value
        {
            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** setProcessConfig Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[4] == "")
            {
                cout << endl << "**** setProcessConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            try
            {
                if ( arguments[4] == "=" )
                {
                    cout << endl << "**** setProcessConfig Failed : Invalid Value of '=', please re-enter" << endl;
                    break;
                }

                oam.setProcessConfig(arguments[1], arguments[2], arguments[3], arguments[4]);
                cout << endl << "   Successfully set " << arguments[3] << " = " << arguments[4] << endl << endl;
                break;
            }
            catch (exception& e)
            {
                cout << endl << "**** setProcessConfig Failed =  " << e.what() << endl;
                break;
            }
        }
        break;

        case 10: // getAlarmConfig- parameters: all or AlarmID
        {
            AlarmConfig alarmconfig;

            if (arguments[1] == "all" || arguments[1] == "")
            {

                // get and all display Alarm config parameters

                cout << endl << "Alarm Configuration" << endl << endl;

                for ( int alarmID = 1 ; alarmID < MAX_ALARM_ID; alarmID++)
                {
                    try
                    {
                        oam.getAlarmConfig(alarmID, alarmconfig);

                        cout << "Alarm ID #" << alarmID << " Configuration information" << endl;

                        cout << "BriefDesc = " << alarmconfig.BriefDesc  << endl;
                        cout << "DetailedDesc = " << alarmconfig.DetailedDesc << endl;

                        //	cout << "EmailAddr = " << alarmconfig.EmailAddr  << endl;
                        //	cout << "PagerNum = " << alarmconfig.PagerNum << endl;

                        switch (alarmconfig.Severity)
                        {
                            case CRITICAL:
                                cout << "Severity = CRITICAL" << endl;
                                break;

                            case MAJOR:
                                cout << "Severity = MAJOR" << endl;
                                break;

                            case MINOR:
                                cout << "Severity = MINOR" << endl;
                                break;

                            case WARNING:
                                cout << "Severity = WARNING" << endl;
                                break;

                            default:
                                cout << "Severity = INFORMATIONAL" << endl;
                                break;
                        }

                        cout << "Threshold = " << alarmconfig.Threshold   << endl;
                        //	cout << "Occurrences = " << alarmconfig.Occurrences << endl;
                        //	cout << "LastIssueTime = " << alarmconfig.LastIssueTime  << endl << endl;
                        cout << endl;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getAlarmConfig Failed =  " << e.what() << endl;
                        break;
                    }
                }

                break;
            }
            else
            {
                // get a single Alarm info
                try
                {
                    oam.getAlarmConfig(atoi(arguments[1].c_str()), alarmconfig);

                    cout << endl << "Alarm ID #" << arguments[1] << " Configuration information" << endl;

                    cout << "BriefDesc = " << alarmconfig.BriefDesc  << endl;
                    cout << "DetailedDesc = " << alarmconfig.DetailedDesc << endl;

                    //	cout << "EmailAddr = " << alarmconfig.EmailAddr  << endl;
                    //	cout << "PagerNum = " << alarmconfig.PagerNum << endl;

                    switch (alarmconfig.Severity)
                    {
                        case CRITICAL:
                            cout << "Severity = CRITICAL" << endl;
                            break;

                        case MAJOR:
                            cout << "Severity = MAJOR" << endl;
                            break;

                        case MINOR:
                            cout << "Severity = MINOR" << endl;
                            break;

                        case WARNING:
                            cout << "Severity = WARNING" << endl;
                            break;

                        default:
                            cout << "Severity = INFORMATIONAL" << endl;
                            break;
                    }

                    cout << "Threshold = " << alarmconfig.Threshold   << endl;
                    //	cout << "Occurrences = " << alarmconfig.Occurrences << endl;
                    //	cout << "LastIssueTime = " << alarmconfig.LastIssueTime  << endl << endl;
                    cout << endl;
                    break;
                }
                catch (exception& e)
                {
                    cout << endl << "**** getAlarmConfig Failed =  " << e.what() << endl;
                    break;
                }
            }
        }
        break;

        case 11: // setAlarmConfig - parameters: AlarmID, Parameter name and value
        {
            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** setAlarmConfig Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[3] == "")
            {
                // need 3 arguments
                cout << endl << "**** setAlarmConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            try
            {
                if ( arguments[3] == "=" )
                {
                    cout << endl << "**** setAlarmConfig Failed : Invalid Value of '=', please re-enter" << endl;
                    break;
                }

                if ( arguments[2] == "Threshold" && arguments[3] != "0" && atoi(arguments[3].c_str()) == 0 )
                {
                    cout << endl << "**** setAlarmConfig Failed : New value must be a number" << endl;
                    break;
                }

                oam.setAlarmConfig(atoi(arguments[1].c_str()), arguments[2], atoi(arguments[3].c_str()));
                cout << endl << "   Successfully set " << arguments[2] << " = " << arguments[3] << endl << endl;
                break;
            }
            catch (exception& e)
            {
                cout << endl << "**** setAlarmConfig Failed =  " << e.what() << endl;
                break;
            }
        }
        break;

        case 12: // getActiveAlarms - parameters: none
        {
            AlarmList alarmList;

            try
            {
                oam.getActiveAlarms(alarmList);
            }
            catch (...)
            {
                // need arguments
                cout << endl << "**** getActiveAlarms Failed : Error in oam.getActiveAlarms" << endl;
                break;
            }

            cout << endl << "Active Alarm List:" << endl << endl;

            AlarmList :: iterator i;

            for (i = alarmList.begin(); i != alarmList.end(); ++i)
            {
                cout << "AlarmID           = " << i->second.getAlarmID() << endl;
                cout << "Brief Description = " << i->second.getDesc() << endl;
                cout << "Alarm Severity    = ";

                switch (i->second.getSeverity())
                {
                    case CRITICAL:
                        cout << "CRITICAL" << endl;
                        break;

                    case MAJOR:
                        cout << "MAJOR" << endl;
                        break;

                    case MINOR:
                        cout << "MINOR" << endl;
                        break;

                    case WARNING:
                        cout << "WARNING" << endl;
                        break;

                    case INFORMATIONAL:
                        cout << "INFORMATIONAL" << endl;
                        break;
                }

                cout << "Time Issued       = " << i->second.getTimestamp() << endl;
                cout << "Reporting Module  = " << i->second.getSname() << endl;
                cout << "Reporting Process = " << i->second.getPname() << endl;
                cout << "Reported Device   = " << i->second.getComponentID() << endl << endl;
            }
        }
        break;

        case 13: // getStorageConfig
        {
            try
            {
                systemStorageInfo_t t;
                t = oam.getStorageConfig();

                string cloud;

                try
                {
                    oam.getSystemConfig("Cloud", cloud);
                }
                catch (...) {}

                string::size_type pos = cloud.find("amazon", 0);

                if (pos != string::npos)
                    cloud = "amazon";

                cout << endl << "System Storage Configuration" << endl << endl;

                cout << "Performance Module (DBRoot) Storage Type = " << boost::get<0>(t) << endl;

                if ( cloud == "amazon" )
                    cout << "User Module Storage Type = " << boost::get<3>(t) << endl;

                cout << "System Assigned DBRoot Count = " << boost::get<1>(t) << endl;

                DeviceDBRootList moduledbrootlist = boost::get<2>(t);

                typedef std::vector<int> dbrootList;
                dbrootList dbrootlist;

                DeviceDBRootList::iterator pt = moduledbrootlist.begin();

                for ( ; pt != moduledbrootlist.end() ; pt++)
                {
                    cout << "DBRoot IDs assigned to 'pm" + oam.itoa((*pt).DeviceID) + "' = ";
                    DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();

                    for ( ; pt1 != (*pt).dbrootConfigList.end() ;)
                    {
                        cout << *pt1;
                        dbrootlist.push_back(*pt1);
                        pt1++;

                        if (pt1 != (*pt).dbrootConfigList.end())
                            cout << ", ";
                    }

                    cout << endl;
                }

                //get any unassigned DBRoots
                DBRootConfigList undbrootlist;

                try
                {
                    oam.getUnassignedDbroot(undbrootlist);
                }
                catch (...) {}

                if ( !undbrootlist.empty() )
                {
                    cout << endl << "DBRoot IDs unassigned = ";
                    DBRootConfigList::iterator pt1 = undbrootlist.begin();

                    for ( ; pt1 != undbrootlist.end() ;)
                    {
                        cout << *pt1;
                        pt1++;

                        if (pt1 != undbrootlist.end())
                            cout << ", ";
                    }

                    cout << endl;
                }

                cout << endl;

                // um volumes
                if (cloud == "amazon" && boost::get<3>(t) == "external")
                {
                    ModuleTypeConfig moduletypeconfig;
                    oam.getSystemConfig("um", moduletypeconfig);

                    for ( int id = 1; id < moduletypeconfig.ModuleCount + 1 ; id++)
                    {
                        string volumeNameID = "UMVolumeName" + oam.itoa(id);
                        string volumeName = oam::UnassignedName;
                        string deviceNameID = "UMVolumeDeviceName" + oam.itoa(id);
                        string deviceName = oam::UnassignedName;

                        try
                        {
                            oam.getSystemConfig( volumeNameID, volumeName);
                            oam.getSystemConfig( deviceNameID, deviceName);
                        }
                        catch (...)
                        {}

                        cout << "Amazon EC2 Volume Name/Device Name for 'um" << id << "': " << volumeName << ", " << deviceName << endl;
                    }
                }

                // pm volumes
                if (cloud == "amazon" && boost::get<0>(t) == "external")
                {
                    cout << endl;

                    DBRootConfigList dbrootConfigList;

                    try
                    {
                        oam.getSystemDbrootConfig(dbrootConfigList);

                        DBRootConfigList::iterator pt = dbrootConfigList.begin();

                        for ( ; pt != dbrootConfigList.end() ; pt++)
                        {
                            string volumeNameID = "PMVolumeName" + oam.itoa(*pt);
                            string volumeName = oam::UnassignedName;
                            string deviceNameID = "PMVolumeDeviceName" + oam.itoa(*pt);
                            string deviceName = oam::UnassignedName;
                            string amazonDeviceNameID = "PMVolumeAmazonDeviceName" + oam.itoa(*pt);
                            string amazondeviceName = oam::UnassignedName;

                            try
                            {
                                oam.getSystemConfig( volumeNameID, volumeName);
                                oam.getSystemConfig( deviceNameID, deviceName);
                                oam.getSystemConfig( amazonDeviceNameID, amazondeviceName);
                            }
                            catch (...)
                            {
                                continue;
                            }

                            cout << "Amazon EC2 Volume Name/Device Name/Amazon Device Name for DBRoot" << oam.itoa(*pt) << ": " << volumeName << ", " << deviceName << ", " << amazondeviceName << endl;
                        }
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getSystemDbrootConfig Failed :  " << e.what() << endl;
                    }

                    // print un-assigned dbroots
                    DBRootConfigList::iterator pt1 = undbrootlist.begin();

                    for ( ; pt1 != undbrootlist.end() ; pt1++)
                    {
                        string volumeNameID = "PMVolumeName" + oam.itoa(*pt1);
                        string volumeName = oam::UnassignedName;
                        string deviceNameID = "PMVolumeDeviceName" + oam.itoa(*pt1);
                        string deviceName = oam::UnassignedName;
                        string amazonDeviceNameID = "PMVolumeAmazonDeviceName" + oam.itoa(*pt1);
                        string amazondeviceName = oam::UnassignedName;

                        try
                        {
                            oam.getSystemConfig( volumeNameID, volumeName);
                            oam.getSystemConfig( deviceNameID, deviceName);
                            oam.getSystemConfig( amazonDeviceNameID, amazondeviceName);
                        }
                        catch (...)
                        {
                            continue;
                        }

                        cout << "Amazon EC2 Volume Name/Device Name/Amazon Device Name for DBRoot" << oam.itoa(*pt1) << ": " << volumeName << ", " << deviceName << ", " << amazondeviceName << endl;
                    }
                }

                string DataRedundancyConfig;
                int DataRedundancyCopies;
                string DataRedundancyStorageType;

                try
                {
                    oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
                    oam.getSystemConfig("DataRedundancyCopies", DataRedundancyCopies);
                    oam.getSystemConfig("DataRedundancyStorageType", DataRedundancyStorageType);
                }
                catch (...) {}

                if ( DataRedundancyConfig == "y" )
                {
                    cout << endl << "Data Redundant Configuration" << endl << endl;
                    cout << "Copies Per DBroot = " << DataRedundancyCopies << endl;
                    //cout << "Storage Type = " << DataRedundancyStorageType << endl;

                    oamModuleInfo_t st;
                    string moduleType;

                    try
                    {
                        st = oam.getModuleInfo();
                        moduleType = boost::get<1>(st);
                    }
                    catch (...) {}

                    if ( moduleType != "pm")
                        break;

                    try
                    {
                        DBRootConfigList dbrootConfigList;
                        oam.getSystemDbrootConfig(dbrootConfigList);

                        DBRootConfigList::iterator pt = dbrootConfigList.begin();

                        for ( ; pt != dbrootConfigList.end() ; pt++)
                        {
                            cout << "DBRoot #" << oam.itoa(*pt) << " has copies on PMs = ";

                            string pmList = "";

                            try
                            {
                                string errmsg;
                                oam.glusterctl(oam::GLUSTER_WHOHAS, oam.itoa(*pt), pmList, errmsg);
                            }
                            catch (...)
                            {}

                            boost::char_separator<char> sep(" ");
                            boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);

                            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                                    it != tokens.end();
                                    ++it)
                            {
                                cout << *it << " ";
                            }

                            cout << endl;
                        }

                        cout << endl;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getSystemDbrootConfig Failed :  " << e.what() << endl;
                    }
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** getStorageConfig Failed :  " << e.what() << endl;
            }

            cout << endl;

            break;
        }

        case 14: // addDbroot parameters: dbroot-number
        {
            string DataRedundancyConfig = "n";

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if (DataRedundancyConfig == "y")
            {
                cout << endl << "**** addDbroot Not Supported on Data Redundancy Configured System, use addModule command to expand your capacity" << endl;
                break;
            }

            if ( localModule != parentOAMModule )
            {
                // exit out since not on active module
                cout << endl << "**** addDbroot Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
                break;
            }

            string cloud;
            bool amazon = false;

            try
            {
                oam.getSystemConfig("Cloud", cloud);
            }
            catch (...) {}

            string::size_type pos = cloud.find("amazon", 0);

            if (pos != string::npos)
                amazon = true;

            if (arguments[1] == "")
            {
                // need atleast 1 arguments
                cout << endl << "**** addDbroot Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            int dbrootNumber = atoi(arguments[1].c_str());

            string DBRootStorageType;

            try
            {
                oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
            }
            catch (...) {}

            string EBSsize = oam::UnassignedName;

            if (amazon && DBRootStorageType == "external" )
            {
                if ( arguments[2] != "")
                    EBSsize = arguments[2];
                else
                {
                    cout << endl;
                    oam.getSystemConfig("PMVolumeSize", EBSsize);

                    string prompt = "Enter EBS storage size in GB, current setting is " + EBSsize + " : ";
                    EBSsize = dataPrompt(prompt);
                }
            }

            //get dbroots ids for reside PM
            try
            {
                DBRootConfigList dbrootlist;
                oam.addDbroot(dbrootNumber, dbrootlist, EBSsize);

                cout << endl << " New DBRoot IDs added = ";

                DBRootConfigList::iterator pt = dbrootlist.begin();

                for ( ; pt != dbrootlist.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != dbrootlist.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** addDbroot Failed: " << e.what() << endl;
                break;
            }

            cout << endl;
        }
        break;

        case 15: // removeDbroot parameters: dbroot-list
        {

            string DataRedundancyConfig = "n";

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if (DataRedundancyConfig == "y")
            {
                cout << endl << "**** removeDbroot Not Supported on Data Redundancy Configured System, use removeModule command to remove modules and dbroots" << endl;
                break;
            }

            if ( localModule != parentOAMModule )
            {
                // exit out since not on active module
                cout << endl << "**** removeDbroot Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
                break;
            }

            if (arguments[1] == "")
            {
                // need atleast 1 arguments
                cout << endl << "**** removeDbroot Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            SystemStatus systemstatus;

            try
            {
                oam.getSystemStatus(systemstatus);

                if (systemstatus.SystemOpState != oam::ACTIVE )
                {
                    cout << endl << "**** removeDbroot Failed,  System has to be in a ACTIVE state" << endl;
                    break;
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** removeDbroot Failed : " << e.what() << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** removeDbroot Failed,  Failed return from getSystemStatus API" << endl;
                break;
            }

            systemStorageInfo_t t;

            try
            {
                t = oam.getStorageConfig();
            }
            catch (...) {}

            string dbrootIDs = arguments[1];

            DBRootConfigList dbrootlist;

            bool assign = false;
            boost::char_separator<char> sep(", ");
            boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);

            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                    it != tokens.end();
                    ++it)
            {
                //check if dbroot is assigned to a pm
                DeviceDBRootList moduledbrootlist = boost::get<2>(t);

                DeviceDBRootList::iterator pt = moduledbrootlist.begin();

                for ( ; pt != moduledbrootlist.end() ; pt++)
                {
                    DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();

                    for ( ; pt1 != (*pt).dbrootConfigList.end() ; pt1++)
                    {
                        if ( atoi((*it).c_str()) == *pt1 )
                        {
                            cout << endl << "**** removeDbroot Failed, dbroot " << *it << " is assigned to a module, unassign first before removing" << endl;
                            assign = true;
                            break;
                        }
                    }
                }

                if (assign)
                    break;

                dbrootlist.push_back(atoi((*it).c_str()));
            }

            if (assign)
                break;

            cout << endl;

            try
            {
                oam.removeDbroot(dbrootlist);

                cout << endl << "   Successful Removal of DBRoots " << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** removeDbroot Failed: " << e.what() << endl;
                break;
            }
        }
        break;

        case 16: // stopSystem - parameters: graceful flag, Ack flag
        {
            BRM::DBRM dbrm;
            bool bDBRMReady = dbrm.isDBRMReady();
            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

            if ( gracefulTemp == INSTALL )
            {
                cout << endl << "Invalid Parameter, INSTALL option not supported. Please use shutdownSystem Command" << endl << endl;
                break;
            }

            cout << endl << "This command stops the processing of applications on all Modules within the MariaDB ColumnStore System" << endl;

            try
            {
                cout << endl << "   Checking for active transactions" << endl;

                if (gracefulTemp != GRACEFUL ||
                        !bDBRMReady ||
                        dbrm.isReadWrite())
                {
                    suspendAnswer = FORCE;
                }

                if (suspendAnswer == CANCEL)	// We don't have an answer from the command line or some other state.
                {
                    // If there are bulkloads, ddl or dml happening, Ask what to do.
                    bool bIsDbrmUp = true;
                    execplan::SessionManager sessionManager;
                    BRM::SIDTIDEntry blockingsid;
                    std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
                    bool bActiveTransactions = false;

                    if (!tableLocks.empty())
                    {
                        oam.DisplayLockedTables(tableLocks, &dbrm);
                        bActiveTransactions = true;
                    }

                    if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
                    {
                        cout << endl << "There are active transactions being processed" << endl;
                        bActiveTransactions = true;
                    }

                    if (bActiveTransactions)
                    {
                        suspendAnswer = AskSuspendQuestion(CmdID);
                        //					if (suspendAnswer == FORCE)
                        //					{
                        //						if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
                        //						{
                        //							break;
                        //						}
                        //					}
                        bNeedsConfirm = false;
                    }
                    else
                    {
                        suspendAnswer = FORCE;
                    }
                }

                if (suspendAnswer == CANCEL)
                {
                    // We're outa here.
                    break;
                }

                if (bNeedsConfirm)
                {
                    if (confirmPrompt(""))
                        break;
                }

                switch (suspendAnswer)
                {
                    case WAIT:
                        cout << endl << "   Waiting for all transactions to complete" << flush;
                        dbrm.setSystemShutdownPending(true, false, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case ROLLBACK:
                        cout << endl << "   Rollback of all transactions" << flush;
                        dbrm.setSystemShutdownPending(true, true, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case FORCE:
                        cout << endl << "   System being stopped now..." << flush;

                        if (bDBRMReady)
                        {
                            dbrm.setSystemShutdownPending(true, false, true);
                        }

                        break;

                    case CANCEL:
                        break;
                }

                oam.stopSystem(gracefulTemp, ackTemp);

                if ( waitForStop() )
                    cout << endl << "   Successful stop of System " << endl << endl;
                else
                    cout << endl << "**** stopSystem Failed : check log files" << endl;

                checkForDisabledModules();
            }
            catch (exception& e)
            {
                string Failed = e.what();

                if (Failed.find("Connection refused") != string::npos)
                {
                    cout << endl << "**** stopSystem Failure : ProcessManager not Active" << endl;
                    cout << "Retry or Run 'shutdownSystem FORCEFUL' command" << endl << endl;
                }
                else
                {
                    cout << endl << "**** stopSystem Failure : " << e.what() << endl;
                    cout << "Retry or Run 'shutdownSystem FORCEFUL' command" << endl << endl;
                }
            }
        }
        break;

        case 17: // shutdownSystem - parameters: graceful flag, Ack flag, suspendAnswer
        {
            BRM::DBRM dbrm;
            bool bDBRMReady = dbrm.isDBRMReady();
            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

            cout << endl << "This command stops the processing of applications on all Modules within the MariaDB ColumnStore System" << endl;

            try
            {
                cout << endl << "   Checking for active transactions" << endl;

                if (gracefulTemp != GRACEFUL ||
                        !bDBRMReady ||
                        dbrm.isReadWrite())
                {
                    suspendAnswer = FORCE;
                }

                if (suspendAnswer == CANCEL)	// We don't have an answer from the command line.
                {
                    // If there are bulkloads, ddl or dml happening, Ask what to do.
                    bool bIsDbrmUp = true;
                    execplan::SessionManager sessionManager;
                    BRM::SIDTIDEntry blockingsid;
                    std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
                    bool bActiveTransactions = false;

                    if (!tableLocks.empty())
                    {
                        oam.DisplayLockedTables(tableLocks, &dbrm);
                        bActiveTransactions = true;
                    }

                    if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
                    {
                        cout << endl << "   There are active transactions being processed" << endl;
                        bActiveTransactions = true;
                    }

                    if (bActiveTransactions)
                    {
                        suspendAnswer = AskSuspendQuestion(CmdID);
                        bNeedsConfirm = false;
                    }
                    else
                    {
                        suspendAnswer = FORCE;
                    }
                }

                if (suspendAnswer == CANCEL)
                {
                    // We're outa here.
                    break;
                }

                if (bNeedsConfirm)
                {
                    if (confirmPrompt(""))
                        break;
                }

                switch (suspendAnswer)
                {
                    case WAIT:
                        cout << endl << "   Waiting for all transactions to complete" << flush;
                        dbrm.setSystemShutdownPending(true, false, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case ROLLBACK:
                        cout << endl << "   Rollback of all transactions" << flush;
                        dbrm.setSystemShutdownPending(true, true, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case FORCE:
                        cout << endl << "   Stopping System..." << flush;

                        if (bDBRMReady)
                        {
                            dbrm.setSystemShutdownPending(true, false, true);
                        }

                        break;

                    case CANCEL:
                        break;
                }

                // This won't return until the system is shutdown. It might take a while to finish what we're working on first.

                oam.stopSystem(gracefulTemp, ackTemp);

                if ( waitForStop() )
                    cout << endl << "   Successful stop of System " << endl;
                else
                    cout << endl << "**** stopSystem Failed : check log files" << endl;

                cout << endl << "   Shutting Down System..." << flush;

                oam.shutdownSystem(gracefulTemp, ackTemp);

                //hdfs / hadoop config
                string DBRootStorageType;

                try
                {
                    oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
                }
                catch (...) {}

                if ( DBRootStorageType == "hdfs")
                {
					string logFile = tmpDir + "/cc-stop.pdsh";
					
                    cmd = "pdsh -a '/" + installDir + "/bin/columnstore stop' > " + logFile + " 2>&1";
                    system(cmd.c_str());

                    if (oam.checkLogStatus(logFile, "exit") )
                    {
                        cout << endl << "ERROR: Stopping MariaDB ColumnStore Service failure, check " << logFile << " exit..." << endl;
                    }
                }
                else
                {
                    cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/status.log";
                    system(cmd.c_str());
                }
            }
            catch (exception& e)
            {
                string Failed = e.what();

                if ( gracefulTemp == FORCEFUL )
                {
                    cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/status.log";
                    system(cmd.c_str());
                    cout << endl << "   Successful shutdown of System (stopped local columnstore service) " << endl << endl;
                }

                if (Failed.find("Connection refused") != string::npos)
                {
                    cout << endl << "**** shutdownSystem Error : ProcessManager not Active, stopping columnstore service" << endl;
                    cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/status.log";
                    system(cmd.c_str());
                    cout << endl << "   Successful stop of local columnstore service " << endl << endl;
                }
                else
                {
                    cout << endl << "**** shutdownSystem Failure : " << e.what() << endl;
                    cout << "    Retry running command using FORCEFUL option" << endl << endl;
                }

                //hdfs / hadoop config
                string DBRootStorageType;

                try
                {
                    oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
                }
                catch (...) {}

                if ( DBRootStorageType == "hdfs")
                {
					string logFile = tmpDir + "cc-stop.pdsh";
                    cmd = "pdsh -a '" + installDir + "/bin/columnstore stop' > " + logFile + " 2>&1";
                    system(cmd.c_str());

                    if (oam.checkLogStatus(logFile, "exit") )
                    {
                        cout << endl << "ERROR: Stopping MariaDB ColumnStore Service failure, check " + logFile + ". exit..." << endl;
                        break;
                    }
                }
            }

            //this is here because a customer likes doing a shutdownsystem then startsystem in a script
            sleep(5);
        }
        break;

        case 18: // startSystem - parameters: Ack flag
        {
            // startSystem Command

            //don't start if a disable module has a dbroot assigned to it
            if (!checkForDisabledModules())
            {
                cout << endl << "Error: startSystem command can't be performed: disabled module has a dbroot assigned to it" << endl;
                break;
            }

            // if columnstore service is down, then start system by starting all of the columnstore services
            // this would be used after a shutdownSystem command
            // if columnstore service is up, send message to ProcMgr to start system (which starts all processes)

            if (!oam.checkSystemRunning())
            {
                cout << endl << "startSystem command, 'columnstore' service is down, sending command to" << endl;
                cout << "start the 'columnstore' service on all modules" << endl << endl;

                SystemModuleTypeConfig systemmoduletypeconfig;
                ModuleTypeConfig moduletypeconfig;
                ModuleConfig moduleconfig;
                systemmoduletypeconfig.moduletypeconfig.clear();
                int systemModuleNumber = 0;

                try
                {
                    oam.getSystemConfig(systemmoduletypeconfig);

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                            // end of list
                            break;

                        systemModuleNumber = systemModuleNumber + systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** startSystem Failed =  " << e.what() << endl;
                    break;
                }

                if ( systemModuleNumber > 1 )
                {
                    if (arguments[1] != "")
                        password = arguments[1];
                    else
                        password = "ssh";

                    //
                    // perform start of columnstore of other servers in the system
                    //

                    DeviceNetworkList::iterator pt;
                    string modulename;

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
                                pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
                                ++pt)
                        {
                            modulename = (*pt).DeviceName;

                            if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
                                    (*pt).DisableState == oam::AUTODISABLEDSTATE )
                            {
                                cout << "   Module '" << modulename << "' is disabled and will not be started" << endl;
                            }
                        }
                    }

                    cout << endl << "   System being started, please wait...";
                    cout.flush();
                    bool FAILED = false;

                    //hdfs / hadoop config
                    string DBRootStorageType;

                    try
                    {
                        oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
                    }
                    catch (...) {}

                    if ( DBRootStorageType == "hdfs")
                    {
						string logFile = tmpDir + "/cc-restart.pdsh";
                        cmd = "pdsh -a '" + installDir + "/bin/columnstore restart' > " + logFile + " 2>&1";
                        system(cmd.c_str());

                        if (oam.checkLogStatus(logFile, "exit") )
                        {
                            cout << endl << "ERROR: Restart MariaDB ColumnStore Service failure, check " << logFile << ". exit..." << endl;
                            break;
                        }
                    }
                    else
                    {
                        for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                        {
                            if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                                // end of list
                                break;

                            int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                            if ( moduleCount == 0 )
                                // skip if no modules
                                continue;

                            for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
                                    pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
                                    ++pt)
                            {
                                modulename = (*pt).DeviceName;

                                if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
                                        (*pt).DisableState == oam::AUTODISABLEDSTATE )
                                {
                                    continue;
                                }

                                if ( modulename == localModule )
                                {
                                    cmd = installDir + "/bin/columnstore restart > " + tmpDir + "/start.log 2>&1";
                                    int rtnCode = system(cmd.c_str());

                                    if (geteuid() == 0 && WEXITSTATUS(rtnCode) != 0)
                                    {
                                        cout << endl << "error with running 'columnstore restart' on local module " << endl;
                                        cout << endl << "**** startSystem Failed" << endl;
                                        break;
                                    }

                                    continue;
                                }

                                HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                                for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                                {
                                    //run remote command script
                                    cmd = installDir + "/bin/remote_command.sh " + (*pt1).IPAddr + " " + password + " '" + installDir + "/bin/columnstore restart' 0";
                                    int rtnCode = system(cmd.c_str());

                                    if (WEXITSTATUS(rtnCode) < 0)
                                    {
                                        cout << endl << "error with running 'columnstore start' on module " + modulename << endl;
                                        cout << endl << "**** startSystem Failed" << endl;

                                        // stop local columnstore service
                                        cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/stop.log 2>&1";
                                        system(cmd.c_str());

                                        FAILED = true;
                                        break;
                                    }
                                    else
                                    {
                                        if (rtnCode > 0)
                                        {
                                            cout << endl << "Invalid Password when running 'columnstore start' on module " + modulename << ", can retry by providing password as the second argument" << endl;
                                            cout << endl << "**** startSystem Failed" << endl;

                                            // stop local columnstore service
                                            cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/stop.log 2>&1";
                                            system(cmd.c_str());

                                            FAILED = true;
                                            break;
                                        }
                                    }
                                }

                                if (FAILED)
                                    break;
                            }
                        }

                        if (FAILED)
                            break;
                    }

                    if (FAILED)
                        break;
                }
                else
                {
                    //just kick off local server
                    cout << endl << "   System being started, please wait...";
                    cout.flush();
                    cmd = installDir + "/bin/columnstore restart > " + tmpDir + "/start.log 2>&1";
                    int rtnCode = system(cmd.c_str());

                    if (geteuid() == 0 && WEXITSTATUS(rtnCode) != 0)
                    {
                        cout << endl << "error with running 'columnstore restart' on local module " << endl;
                        cout << endl << "**** startSystem Failed" << endl;
                        break;
                    }
                }

                if ( waitForActive() )
                    cout << endl << "   Successful start of System " << endl << endl;
                else
                    cout << endl << "**** startSystem Failed : check log files" << endl;
            }
            else
            {
                getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

                try
                {
                    cout << endl << "   System being started, please wait...";
                    cout.flush();
                    oam.startSystem(ackTemp);

                    if ( waitForActive() )
                        cout << endl << "   Successful start of System " << endl << endl;
                    else
                        cout << endl << "**** startSystem Failed : check log files" << endl;
                }
                catch (exception& e)
                {
                    cout << endl << "**** startSystem Failed :  " << e.what() << endl;
                    string Failed = e.what();

                    if (Failed.find("Database Test Error") != string::npos)
                        cout << "Database Test Error occurred, check Alarm and Logs for addition Information" << endl;
                }
            }
        }
        break;

        case 19: // restartSystem - parameters: graceful flag, Ack flag
        {
            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm, &password);

            //don't start if a disable module has a dbroot assigned to it
            if (!checkForDisabledModules())
            {
                cout << endl << "Error: restartSystem command can't be performed: disabled module has a dbroot assigned to it" << endl;
                break;
            }

            // if columnstore service is down, then start system by starting all of the columnstore services
            // this would be used after a shutdownSystem command
            // if columnstore service is up, send message to ProcMgr to start system (which starts all processes)

            if (!oam.checkSystemRunning())
            {
                if (bNeedsConfirm)
                {
                    if (confirmPrompt("")) // returns true if user wants to quit.
                        break;
                }

                cout << "restartSystem command, 'columnstore' service is down, sending command to" << endl;
                cout << "start the 'columnstore' service on all modules" << endl << endl;

                SystemModuleTypeConfig systemmoduletypeconfig;
                ModuleTypeConfig moduletypeconfig;
                ModuleConfig moduleconfig;
                systemmoduletypeconfig.moduletypeconfig.clear();
                int systemModuleNumber = 0;

                try
                {
                    oam.getSystemConfig(systemmoduletypeconfig);

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                            // end of list
                            break;

                        systemModuleNumber = systemModuleNumber + systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** restartSystem Failed =  " << e.what() << endl;
                    break;
                }

                if ( systemModuleNumber > 1 )
                {
                    if (password.empty())
                        password = "ssh";

                    //
                    // perform start of columnstore of other servers in the system
                    //

                    DeviceNetworkList::iterator pt;
                    string modulename;

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
                                pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
                                ++pt)
                        {
                            modulename = (*pt).DeviceName;

                            if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
                                    (*pt).DisableState == oam::AUTODISABLEDSTATE )
                            {
                                cout << "   Module '" << modulename << "' is disabled and will not be started" << endl;
                            }
                        }
                    }

                    cout << endl << "   System being started, please wait...";
                    cout.flush();
                    bool FAILED = false;

                    //hdfs / hadoop config
                    string DBRootStorageType;

                    try
                    {
                        oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
                    }
                    catch (...) {}

                    if ( DBRootStorageType == "hdfs")
                    {
						string logFile = tmpDir + "/cc-restart.pdsh";
                        cmd = "pdsh -a '" + installDir + "/bin/columnstore restart' > " + logFile + " 2>&1";
                        system(cmd.c_str());

                        if (oam.checkLogStatus(logFile, "exit") )
                        {
                            cout << endl << "ERROR: Restart MariaDB ColumnStore Service failue, check " << logFile << ". exit..." << endl;
                            break;
                        }
                    }
                    else
                    {
                        for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                        {
                            if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                                // end of list
                                break;

                            int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                            if ( moduleCount == 0 )
                                // skip if no modules
                                continue;

                            for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
                                    pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
                                    ++pt)
                            {
                                modulename = (*pt).DeviceName;

                                if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
                                        (*pt).DisableState == oam::AUTODISABLEDSTATE )
                                {
                                    continue;
                                }

                                if ( modulename == localModule )
                                    continue; // do last

                                HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                                for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                                {
                                    //run remote command script
                                    cmd = installDir + "/bin/remote_command.sh " + (*pt1).IPAddr + " " + password + " '" + installDir + "/bin/columnstore restart' 0";

                                    int rtnCode = system(cmd.c_str());

                                    if (WEXITSTATUS(rtnCode) < 0)
                                    {
                                        cout << endl << "error with running 'columnstore start' on module " + modulename << endl;
                                        cout << endl << "**** restartSystem Failed" << endl;

                                        // stop local columnstore service
                                        cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/stop.log 2>&1";
                                        system(cmd.c_str());

                                        FAILED = true;
                                        break;
                                    }
                                    else
                                    {
                                        if (rtnCode > 0)
                                        {
                                            cout << endl << "Invalid Password when running 'columnstore start' on module " + modulename << ", can retry by providing password as the second argument" << endl;
                                            cout << endl << "**** restartSystem Failed" << endl;
                                            FAILED = true;

                                            // stop local columnstore service
                                            cmd = installDir + "/bin/columnstore stop > " + tmpDir + "/stop.log 2>&1";
                                            system(cmd.c_str());

                                            break;
                                        }
                                    }
                                }

                                if (FAILED)
                                    break;
                            }

                            if (FAILED)
                                break;

                            //RESTART LOCAL HOST
                            cmd = installDir + "/bin/columnstore restart > " + tmpDir + "/start.log 2>&1";
                            int rtnCode = system(cmd.c_str());

                            if (geteuid() == 0 && WEXITSTATUS(rtnCode) != 0)
                            {
                                cout << endl << "error with running 'columnstore restart' on local module " << endl;
                                cout << endl << "**** restartSystem Failed" << endl;
                                break;
                            }
                        }

                        if (FAILED)
                            break;
                    }
                }
                else
                {
                    //just kick off local server
                    cout << "   System being restarted, please wait...";
                    cout.flush();
                    cmd = installDir + "/bin/columnstore restart > " + tmpDir + "/start.log 2>&1";
                    int rtnCode = system(cmd.c_str());

                    if (WEXITSTATUS(rtnCode) != 0)
                    {
                        cout << endl << "error with running 'columnstore start' on local module " << endl;
                        cout << endl << "**** restartSystem Failed" << endl;
                        break;
                    }
                }

                if ( waitForActive() )
                    cout << endl << "   Successful restart of System " << endl << endl;
                else
                    cout << endl << "**** restartSystem Failed : check log files" << endl;
            }
            else
            {
                BRM::DBRM dbrm;
                bool bDBRMReady = dbrm.isDBRMReady();

                try
                {
                    if (gracefulTemp != GRACEFUL ||
                            !bDBRMReady ||
                            dbrm.isReadWrite())
                    {
                        suspendAnswer = FORCE;
                    }

                    if (suspendAnswer == CANCEL)	// We don't have an answer from the command line.
                    {
                        // If there are bulkloads, ddl or dml happening, Ask what to do.
                        bool bIsDbrmUp = true;
                        execplan::SessionManager sessionManager;
                        BRM::SIDTIDEntry blockingsid;
                        std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
                        bool bActiveTransactions = false;

                        if (!tableLocks.empty())
                        {
                            oam.DisplayLockedTables(tableLocks, &dbrm);
                            bActiveTransactions = true;
                        }

                        if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
                        {
                            cout << endl << "There are active transactions being processed" << endl;
                            bActiveTransactions = true;
                        }

                        if (bActiveTransactions)
                        {
                            suspendAnswer = AskSuspendQuestion(CmdID);
                            //						if (suspendAnswer == FORCE)
                            //						{
                            //							if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
                            //							{
                            //								break;
                            //							}
                            //						}
                            bNeedsConfirm = false;
                        }
                        else
                        {
                            suspendAnswer = FORCE;
                        }
                    }

                    if (suspendAnswer == CANCEL)
                    {
                        // We're outa here.
                        break;
                    }

                    if (bNeedsConfirm)
                    {
                        if (confirmPrompt(""))
                            break;
                    }

                    switch (suspendAnswer)
                    {
                        case WAIT:
                            cout << endl << "   Waiting for all transactions to complete" << flush;
                            dbrm.setSystemShutdownPending(true, false, false);
                            gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                            break;

                        case ROLLBACK:
                            cout << endl << "   Rollback of all transactions" << flush;
                            dbrm.setSystemShutdownPending(true, true, false);
                            gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                            break;

                        case FORCE:
                            cout << endl << "   System being restarted now ..." << flush;

                            if (bDBRMReady)
                            {
                                dbrm.setSystemShutdownPending(true, false, true);
                            }

                            break;

                        case CANCEL:
                            break;
                    }

                    int returnStatus = oam.restartSystem(gracefulTemp, ackTemp);

                    switch (returnStatus)
                    {
                        case API_SUCCESS:
                            if ( waitForActive() )
                                cout << endl << "   Successful restart of System " << endl << endl;
                            else
                                cout << endl << "**** restartSystem Failed : check log files" << endl;

                            break;

                        case API_CANCELLED:
                            cout << endl << "   Restart of System canceled" << endl << endl;
                            break;

                        default:
                            cout << endl << "**** restartSystem Failed : Check system logs" << endl;
                            break;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** restartSystem Failed :  " << e.what() << endl;
                    string Failed = e.what();

                    if (Failed.find("Database Test Error") != string::npos)
                        cout << "Database Test Error occurred, check Alarm and Logs for additional Information" << endl;
                }
            }
        }
        break;

        case 20: // getSystemStatus - parameters: NONE
        {
            try
            {
                printSystemStatus();
            }
            catch (...)
            {
                break;
            }

        }
        break;

        case 21: // getProcessStatus - parameters: NONE
        {
            try
            {
                printProcessStatus();
            }
            catch (...)
            {
                break;
            }
        }
        break;

        case 22: // system - UNIX system command
        {
            if (arguments[1] == "")
            {
                // need arguments
                cout << endl << "**** system Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            for (int j = 2; j < ArgNum; j++)
            {
                arguments[1].append(" ");
                arguments[1].append(arguments[j]);
            }

            system (arguments[1].c_str());
        }
        break;

        case 23: // getAlarmHistory
        {
            if (arguments[1] == "")
            {
                // need arguments
                cout << endl << "**** getAlarmHistory Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            if ( arguments[1].size() != 8 )
            {
                cout << "date not in correct format, enter MM/DD/YY" << endl;
                break;
            }

            if ( !(arguments[1].substr(2, 1) == "/" && arguments[1].substr(5, 1) == "/") )
            {
                cout << "date not in correct format, enter MM/DD/YY" << endl;
                break;
            }

            AlarmList alarmList;

            try
            {
                oam.getAlarms(arguments[1], alarmList);
            }
            catch (exception& e)
            {
                cout << endl << "**** getAlarms Failed =  " << e.what() << endl;
                break;
            }

            cout << endl << "Historical Alarm List for " + arguments[1] + " :" << endl << endl;

            AlarmList :: iterator i;
            int counter = 0;

            for (i = alarmList.begin(); i != alarmList.end(); ++i)
            {
                switch (i->second.getState())
                {
                    case SET:
                        cout << "SET" << endl;
                        break;

                    case CLEAR:
                        cout << "CLEAR" << endl;
                        break;
                }

                cout << "AlarmID           = " << i->second.getAlarmID() << endl;
                cout << "Brief Description = " << i->second.getDesc() << endl;
                cout << "Alarm Severity    = ";

                switch (i->second.getSeverity())
                {
                    case CRITICAL:
                        cout << "CRITICAL" << endl;
                        break;

                    case MAJOR:
                        cout << "MAJOR" << endl;
                        break;

                    case MINOR:
                        cout << "MINOR" << endl;
                        break;

                    case WARNING:
                        cout << "WARNING" << endl;
                        break;

                    case INFORMATIONAL:
                        cout << "INFORMATIONAL" << endl;
                        break;
                }

                cout << "Time Issued       = " << i->second.getTimestamp() << endl;
                cout << "Reporting Module  = " << i->second.getSname() << endl;
                cout << "Reporting Process = " << i->second.getPname() << endl;
                cout << "Reported Device   = " << i->second.getComponentID() << endl << endl;

                counter++;

                if ( counter > 4 )
                {
                    // continue prompt
                    if (confirmPrompt("Displaying Alarm History"))
                        break;

                    counter = 0;
                }
            }
        }
        break;

        case 24: // monitorAlarms
        {
            cout << endl << "Monitor for System Alarms" << endl;
            cout << " Enter control-C to return to command line" << endl << endl;

            cmd = "tail -n 0 -f " + alarmmanager::ALARM_FILE;
            system(cmd.c_str());
        }
        break;

        case 25: // resetAlarm
        {
            if (arguments[1] == "")
            {
                // need 3 arguments
                cout << endl << "**** resetAlarm Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            try
            {
                // check if requested alarm is Active
                AlarmList alarmList;
                Oam oam;

                try
                {
                    oam.getActiveAlarms(alarmList);
                }
                catch (exception& e)
                {
                    cout << endl << "**** getActiveAlarm Failed =  " << e.what() << endl;
                    break;
                }

                bool found = false;
                AlarmList::iterator i;

                for (i = alarmList.begin(); i != alarmList.end(); ++i)
                {
                    // check if matching ID
                    if ( arguments[1] != "ALL" )
                    {
                        if (atoi(arguments[1].c_str()) != (i->second).getAlarmID() )
                            continue;

                        if ( arguments[2] != "ALL")
                        {
                            if (arguments[2].compare((i->second).getSname()) != 0)
                                continue;

                            if ( arguments[3] != "ALL")
                            {
                                if (arguments[3].compare((i->second).getComponentID()) != 0 )
                                    continue;
                            }
                        }
                    }

                    ALARMManager aManager;
                    aManager.sendAlarmReport((i->second).getComponentID().c_str(),
                                             (i->second).getAlarmID(),
                                             CLEAR,
                                             (i->second).getSname(),
                                             "mcsadmin");

                    cout << endl << "   Alarm Successfully Reset: ";
                    cout << "ID = " << oam.itoa((i->second).getAlarmID());
                    cout << " / Module = " << (i->second).getSname();
                    cout << " / Device = " << (i->second).getComponentID() << endl;
                    found = true;
                }

                // check is a SET alarm was found, if not return
                if (!found)
                {
                    cout << endl << "**** resetAlarm Failed : Requested Alarm is not Set" << endl;
                    break;
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** resetAlarm Failed =  " << e.what() << endl;
                break;
            }
        }
        break;

        case 26: // enableLog
        {
            if (arguments[2] == "")
            {
                // need 2 arguments
                cout << endl << "**** Failed : enableLog Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            // covert second argument (level) into lowercase
            transform (arguments[2].begin(), arguments[2].end(), arguments[2].begin(), to_lower());

            try
            {
                oam.updateLog(ENABLEDSTATE, arguments[1], arguments[2]);
                cout << endl << "   Successful Enabling of Logging " << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** enableLog Failed :  " << e.what() << endl;
            }
        }
        break;

        case 27: // disableLog
        {
            if (arguments[2] == "")
            {
                // need 2 arguments
                cout << endl << "**** disableLog Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            // covert second argument (level) into lowercase
            transform (arguments[2].begin(), arguments[2].end(), arguments[2].begin(), to_lower());

            try
            {
                oam.updateLog(MANDISABLEDSTATE, arguments[1], arguments[2]);
                cout << endl << "   Successful Disabling of Logging " << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** disableLog Failed :  " << e.what() << endl;
            }
        }
        break;

        case 28: // switchParentOAMModule
        {
            BRM::DBRM dbrm;
            bool bDBRMReady = dbrm.isDBRMReady();
            string module;
            bool bUseHotStandby = true;
            SystemStatus systemstatus;
            Oam oam;

            //first check that the system is in a ACTIVE OR MAN_OFFLINE STATE
            try
            {
                oam.getSystemStatus(systemstatus);

                if (systemstatus.SystemOpState == ACTIVE ||
                        systemstatus.SystemOpState == MAN_OFFLINE)
                {
                    module = "";
                }
                else
                {
                    cout << endl << "**** switchParentOAMModule Failed : System Status needs to be ACTIVE or MAN_OFFLINE" << endl;
                    break;
                }
            }
            catch (...)
            {}

            // First get the values for the standard arguments
            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

            // Now check for arguments unique to this command. In this case, a valid
            // module name.
            for (int i = 1; i < ArgNum; i++)
            {
                if (arguments[i].size() > 0)
                {
                    if (oam.validateModule(arguments[i]) == API_SUCCESS)
                    {
                        module = arguments[i];
                        bUseHotStandby = false;
                        break;
                    }
                }
            }

            //check if there are more than 1 pm modules to start with
            ModuleTypeConfig moduletypeconfig;
            oam.getSystemConfig("pm", moduletypeconfig);

            if ( moduletypeconfig.ModuleCount < 2 )
            {
                cout << endl << "**** switchParentOAMModule Failed : Command only support on systems with Multiple Performance Modules" << endl;
//				break;
            }

            string DBRootStorageType;

            try
            {
                oam.getSystemConfig("DBRootStorageType", DBRootStorageType);
            }
            catch (...) {}

            string DataRedundancyConfig = "n";

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if (DBRootStorageType == "internal" && DataRedundancyConfig == "n")
            {
                cout << endl << "**** switchParentOAMModule Failed : DBRoot Storage type =  internal/non-data-replication" << endl;
                break;
            }

            string ParentOAMModuleName;

            try
            {
                oam.getSystemConfig("ParentOAMModuleName", ParentOAMModuleName);
            }
            catch (...) {}

            if (bUseHotStandby)
            {
                oam.getSystemConfig("StandbyOAMModuleName", module);

                if ( module.empty() || module == oam::UnassignedName )
                {
                    cout << endl << "**** switchParentOAMModule Failed : There's no hot standby defined" << endl << "     enter a Performance Module" << endl;
                    break;
                }

                cout << endl << "Switching to the Hot-Standby Parent OAM Module '" << module << "'" << endl;
            }
            else
            {
                parentOAMModule = getParentOAMModule();

                if ( module == parentOAMModule )
                {
                    cout << endl << "**** switchParentOAMModule Failed : " << module << " is already the Active Parent OAM Module" << endl;
                    break;
                }

                cout << endl << "Switching to the Performance Module '" << module << "'" << endl;
            }

            //check for gluster system is do-able
            if (DataRedundancyConfig == "y")
            {
                // get to-module assigned DBRoots and see if current active PM
                // has a copy

                DBRootConfigList toPMbrootConfigList;

                try
                {
                    string moduleID = module.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);
                    oam.getPmDbrootConfig(atoi(moduleID.c_str()), toPMbrootConfigList);

                    bool match = false;
                    DBRootConfigList::iterator pt = toPMbrootConfigList.begin();

                    for ( ; pt != toPMbrootConfigList.end() ; pt++)
                    {
                        // check if ACTIVE PM has a copy of Dbroot
                        string pmList = "";

                        try
                        {
                            string errmsg;
                            int ret = oam.glusterctl(oam::GLUSTER_WHOHAS, oam.itoa(*pt), pmList, errmsg);

                            if ( ret != 0 )
                            {
                                cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
                                break;
                            }
                        }
                        catch (...)
                        {
                            cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
                            break;
                        }

                        boost::char_separator<char> sep(" ");
                        boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);

                        for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
                                it1 != tokens.end();
                                ++it1)
                        {
                            string pmModule = "pm" + *it1;

                            if ( pmModule == ParentOAMModuleName )
                            {
                                match = true;
                                break;
                            }
                        }
                    }

                    if (!match)
                    {
                        cout << endl << "**** switchParentOAMModule Failed : The Current Active PM doesn't have a copy of any DBROOTs that reside on the Siwtching PM " << endl;
                        break;
                    }

                    //check if switching to PM has DBROOT 1
                    string pmList = "";

                    try
                    {
                        string errmsg;
                        int ret = oam.glusterctl(oam::GLUSTER_WHOHAS, "1", pmList, errmsg);

                        if ( ret != 0 )
                        {
                            cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
                            break;
                        }
                    }
                    catch (...)
                    {
                        cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
                        break;
                    }

                    match = false;
                    boost::char_separator<char> sep(" ");
                    boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);

                    for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
                            it1 != tokens.end();
                            ++it1)
                    {
                        string pmModule = "pm" + *it1;

                        if ( pmModule == module )
                        {
                            match = true;
                            break;
                        }
                    }

                    if (!match)
                    {
                        cout << endl << "**** switchParentOAMModule Failed : The Switching to PM doesn't have a copy of the DBROOT #1" << endl;
                        break;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** getPmDbrootConfig Failed for '" << module << "' : " << e.what() << endl;
                    break;
                }
            }


            if (bNeedsConfirm)
            {
                // confirm request
                if (confirmPrompt("This command switches the Active Parent OAM Module and should only be executed on an idle system."))
                    break;
            }

            string MySQLRep;

            try
            {
                oam.getSystemConfig("MySQLRep", MySQLRep);
            }
            catch (...) {}

            try
            {
                cout << endl << "   Check for active transactions" << endl;

                if (!bDBRMReady ||
                        dbrm.isReadWrite() != 0)
                {
                    suspendAnswer = FORCE;
                }

                if (suspendAnswer == CANCEL)	// We don't have an answer from the command line.
                {
                    // If there are bulkloads, ddl or dml happening, Ask what to do.
                    bool bIsDbrmUp = true;
                    execplan::SessionManager sessionManager;
                    BRM::SIDTIDEntry blockingsid;
                    std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
                    bool bActiveTransactions = false;

                    if (!tableLocks.empty())
                    {
                        oam.DisplayLockedTables(tableLocks, &dbrm);
                        bActiveTransactions = true;
                    }

                    if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
                    {
                        cout << endl << "There are active transactions being processed" << endl;
                        bActiveTransactions = true;
                    }

                    if (bActiveTransactions)
                    {
                        suspendAnswer = AskSuspendQuestion(CmdID);
                        //					if (suspendAnswer == FORCE)
                        //					{
                        //						if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
                        //						{
                        //							break;
                        //						}
                        //					}
                    }
                    else
                    {
                        suspendAnswer = FORCE;
                    }
                }

                if (suspendAnswer == CANCEL)
                {
                    // We're outa here.
                    break;
                }

                switch (suspendAnswer)
                {
                    case WAIT:
                        cout << endl << "   Waiting for all transactions to complete" << flush;
                        dbrm.setSystemShutdownPending(true, false, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case ROLLBACK:
                        cout << endl << "   Rollback of all transactions" << flush;
                        dbrm.setSystemShutdownPending(true, true, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case FORCE:
                        cout << endl << "   Switch Active Parent OAM Module starting..." << endl;

                        if (bDBRMReady)
                        {
                            dbrm.setSystemShutdownPending(true, false, true);
                        }

                        break;

                    case CANCEL:
                        break;
                }

                if (oam.switchParentOAMModule(module, gracefulTemp))
                {
                    if (waitForActive())
                    {
                        // give time for new ProcMgr to go active
                        sleep (10);
                        cout << endl << "   Successful Switch Active Parent OAM Module" << endl << endl;
                    }
                    else
                        cout << endl << "**** Switch Active Parent OAM Module failed : check log files" << endl;
                }
                else
                {
                    // give time for new ProcMgr to go active
                    sleep (10);
                    cout << endl << "   Successful Switch Active Parent OAM Module" << endl << endl;
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** switchParentOAMModule Failed :  " << e.what() << endl;
                break;
            }
        }
        break;

        case 29: // getStorageStatus
        {
            SystemStatus systemstatus;
            Oam oam;

            cout << "System External DBRoot Storage Statuses" << endl << endl;
            cout << "Component     Status                       Last Status Change" << endl;
            cout << "------------  --------------------------   ------------------------" << endl;

            try
            {
                oam.getSystemStatus(systemstatus, false);

                if ( systemstatus.systemdbrootstatus.dbrootstatus.size() == 0 )
                {
                    cout << " No External DBRoot Storage Configured" << endl;
                    break;
                }

                for ( unsigned int i = 0 ; i < systemstatus.systemdbrootstatus.dbrootstatus.size(); i++)
                {
                    if ( systemstatus.systemdbrootstatus.dbrootstatus[i].Name.empty() )
                        // end of list
                        break;

                    cout << "DBRoot #";
                    cout.setf(ios::left);
                    cout.width(6);
                    cout << systemstatus.systemdbrootstatus.dbrootstatus[i].Name;
                    cout.width(29);
                    int state = systemstatus.systemdbrootstatus.dbrootstatus[i].OpState;
                    printState(state, " ");
                    cout.width(24);
                    string stime = systemstatus.systemdbrootstatus.dbrootstatus[i].StateChangeDate ;
                    stime = stime.substr (0, 24);
                    cout << stime << endl;
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getSystemStatus Failed =  " << e.what() << endl;
            }

            string DataRedundancyConfig;
            int DataRedundancyCopies;
            string DataRedundancyStorageType;

            try
            {
                oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
                oam.getSystemConfig("DataRedundancyCopies", DataRedundancyCopies);
                oam.getSystemConfig("DataRedundancyStorageType", DataRedundancyStorageType);
            }
            catch (...) {}

            if ( DataRedundancyConfig == "y" )
            {
                string arg1 = "";
                string arg2 = "";
                string errmsg = "";
                int ret = oam.glusterctl(oam::GLUSTER_STATUS, arg1, arg2, errmsg);

                if ( ret == 0 )
                {
                    cout << arg2 << endl;
                }
                else
                {
                    cerr << "FAILURE: Status check error: " + errmsg << endl;
                }
            }
        }
        break;

        case 30: // getLogConfig
        {
            try
            {
                SystemLogConfigData systemconfigdata;
                LogConfigData logconfigdata;

                oam.getLogConfig(systemconfigdata);

                string configFileName;
                oam.getSystemConfig("SystemLogConfigFile", configFileName);

                cout << endl << "MariaDB ColumnStore System Log Configuration Data" << endl << endl;

                cout << "System Logging Configuration File being used: " <<  configFileName << endl << endl;

                cout << "Module    Configured Log Levels" << endl;
                cout << "------    ---------------------------------------" << endl;

                SystemLogConfigData::iterator pt = systemconfigdata.begin();

                for (; pt != systemconfigdata.end() ; pt++)
                {
                    logconfigdata = *pt;
                    string module = logconfigdata.moduleName;
                    int data = logconfigdata.configData;

                    if ( data < API_MAX )
                    {
                        // failure API status returned
                        cout.setf(ios::left);
                        cout.width(10);
                        cout << logconfigdata.moduleName;
                        cout << "getLogConfig Failed - Error : " << data << endl;
                    }
                    else
                    {
                        cout.setf(ios::left);
                        cout.width(10);
                        cout << logconfigdata.moduleName;

                        data = data - API_MAX;

                        if ( data == 0 )
                            // no level configured
                            cout << "None Configured" << endl;
                        else
                        {
                            if ( ((data & LEVEL_CRITICAL) ? 1 : 0) == 1 )
                                cout << "Critical ";

                            if ( ((data & LEVEL_ERROR) ? 1 : 0) == 1 )
                                cout << "Error ";

                            if ( ((data & LEVEL_WARNING) ? 1 : 0) == 1 )
                                cout << "Warning ";

                            if ( ((data & LEVEL_INFO) ? 1 : 0) == 1 )
                                cout << "Info ";

                            if ( ((data & LEVEL_DEBUG) ? 1 : 0) == 1 )
                                cout << "Debug ";

                            cout << endl;
                        }
                    }
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** getLogConfig Failed :  " << e.what() << endl;
                break;
            }

        }
        break;

        case 31: // movePmDbrootConfig parameters: pm-reside dbroot-list pm-to
        {
            if ( localModule != parentOAMModule )
            {
                // exit out since not on active module
                cout << endl << "**** movePmDbrootConfig Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
                break;
            }

            //check the system status / service status and only allow command when System is MAN_OFFLINE
            if (oam.checkSystemRunning())
            {
                SystemStatus systemstatus;

                try
                {
                    oam.getSystemStatus(systemstatus);

                    if (systemstatus.SystemOpState != oam::MAN_OFFLINE )
                    {
                        cout << endl << "**** movePmDbrootConfig Failed,  System has to be in a MAN_OFFLINE state, stop system first" << endl;
                        break;
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** movePmDbrootConfig Failed : " << e.what() << endl;
                    break;
                }
                catch (...)
                {
                    cout << endl << "**** movePmDbrootConfig Failed,  Failed return from getSystemStatus API" << endl;
                    break;
                }
            }

            if (arguments[3] == "")
            {
                // need arguments
                cout << endl << "**** movePmDbrootConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            string residePM = arguments[1];
            string dbrootIDs = arguments[2];
            string toPM = arguments[3];

            string residePMID = residePM.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);;
            string toPMID = toPM.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);;

            // check module status
            try
            {
                bool degraded;
                int opState;
                oam.getModuleStatus(toPM, opState, degraded);

                if (opState == oam::AUTO_DISABLED ||
                        opState == oam::MAN_DISABLED)
                {
                    cout << "**** movePmDbrootConfig Failed: " << toPM << " is DISABLED." << endl;
                    cout << "Run alterSystem-EnableModule to enable module" << endl;
                    break;
                }

                if (opState == oam::FAILED)
                {
                    cout << "**** movePmDbrootConfig Failed: " << toPM << " is in a FAILED state." << endl;
                    break;
                }
            }
            catch (exception& ex)
            {}

            bool moveDBRoot1 = false;
            bool found = false;
            boost::char_separator<char> sep(", ");
            boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);

            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                    it != tokens.end();
                    ++it)
            {
                if (*it == "1" )
                {
                    moveDBRoot1 = true;
                    break;
                }

                //if gluster, check if toPM is has a copy
                string DataRedundancyConfig;

                try
                {
                    oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
                }
                catch (...) {}

                if ( DataRedundancyConfig == "y" )
                {
                    string pmList = "";

                    try
                    {
                        string errmsg;
                        oam.glusterctl(oam::GLUSTER_WHOHAS, *it, pmList, errmsg);
                    }
                    catch (...)
                    {}

                    boost::char_separator<char> sep(" ");
                    boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);

                    for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
                            it1 != tokens.end();
                            ++it1)
                    {
                        if ( *it1 == toPMID )
                        {
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        cout << endl << "**** movePmDbrootConfig Failed : Data Redundancy Configured, DBRoot #" << *it << " doesn't have a copy on " << toPM << endl;
                        cout << "Run getStorageConfig to get copy information" << endl << endl;
                        break;
                    }
                }
                else
                    found = true;
            }

            if (moveDBRoot1)
            {
                cout << endl << "**** movePmDbrootConfig Failed : Can't move dbroot #1" << endl << endl;
                break;
            }

            if (!found)
            {
                break;
            }


            if (residePM.find("pm") == string::npos )
            {
                cout << endl << "**** movePmDbrootConfig Failed : Parmameter 1 is not a Performance Module name, enter 'help' for additional information" << endl;
                break;
            }

            if (toPM.find("pm") == string::npos )
            {
                cout << endl << "**** movePmDbrootConfig Failed : Parmameter 3 is not a Performance Module name, enter 'help' for additional information" << endl;
                break;
            }

            if (residePM == toPM )
            {
                cout << endl << "**** movePmDbrootConfig Failed : Reside and To Performance Modules are the same" << endl;
                break;
            }

            //get dbroots ids for reside PM
            DBRootConfigList residedbrootConfigList;

            try
            {
                oam.getPmDbrootConfig(atoi(residePMID.c_str()), residedbrootConfigList);

                cout << endl << "DBRoot IDs currently assigned to '" + residePM + "' = ";

                DBRootConfigList::iterator pt = residedbrootConfigList.begin();

                for ( ; pt != residedbrootConfigList.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != residedbrootConfigList.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getPmDbrootConfig Failed for '" << residePM << "' : " << e.what() << endl;
                break;
            }

            //get dbroots ids for reside PM
            DBRootConfigList todbrootConfigList;

            try
            {
                oam.getPmDbrootConfig(atoi(toPMID.c_str()), todbrootConfigList);

                cout << "DBRoot IDs currently assigned to '" + toPM + "' = ";

                DBRootConfigList::iterator pt = todbrootConfigList.begin();

                for ( ; pt != todbrootConfigList.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != todbrootConfigList.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getPmDbrootConfig Failed for '" << toPM << "' : " << e.what() << endl;
                break;
            }

            cout << endl << "DBroot IDs being moved, please wait..." << endl << endl;

            try
            {
                oam.manualMovePmDbroot(residePM, dbrootIDs, toPM);
            }
            catch (...)
            {
                cout << endl << "**** manualMovePmDbroot Failed : API Failure" << endl;
                break;
            }

            //get dbroots ids for reside PM
            try
            {
                residedbrootConfigList.clear();
                oam.getPmDbrootConfig(atoi(residePMID.c_str()), residedbrootConfigList);

                cout << "DBRoot IDs newly assigned to '" + residePM + "' = ";

                DBRootConfigList::iterator pt = residedbrootConfigList.begin();

                for ( ; pt != residedbrootConfigList.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != residedbrootConfigList.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getPmDbrootConfig Failed for '" << toPM << "' : " << e.what() << endl;
                break;
            }

            try
            {
                todbrootConfigList.clear();
                oam.getPmDbrootConfig(atoi(toPMID.c_str()), todbrootConfigList);

                cout << "DBRoot IDs newly assigned to '" + toPM + "' = ";

                DBRootConfigList::iterator pt = todbrootConfigList.begin();

                for ( ; pt != todbrootConfigList.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != todbrootConfigList.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getPmDbrootConfig Failed for '" << toPM << "' : " << e.what() << endl;
                break;
            }

        }
        break;

        case 32: // suspendDatabaseWrites
        {
            BRM::DBRM dbrm;
            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

            cout << endl << "This command suspends the DDL/DML writes to the MariaDB ColumnStore Database" << endl;

            try
            {

                if (!dbrm.isDBRMReady())
                {
                    cout << endl << "   The Controller Node is not responding.\n   The system can't be set into write suspend mode" << endl <<  flush;
                    break;
                }
                else if (dbrm.isReadWrite() != 0)
                {
                    suspendAnswer = FORCE;
                }

                // If there are bulkloads, ddl or dml happening, refuse the request
                if (suspendAnswer == CANCEL)	// We don't have an answer from the command line.
                {
                    // If there are bulkloads, ddl or dml happening, Ask what to do.
                    bool bIsDbrmUp = true;
                    execplan::SessionManager sessionManager;
                    BRM::SIDTIDEntry blockingsid;
                    std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
                    bool bActiveTransactions = false;

                    if (!tableLocks.empty())
                    {
                        oam.DisplayLockedTables(tableLocks, &dbrm);
                        bActiveTransactions = true;
                    }

                    if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
                    {
                        cout << endl << "There are active transactions being processed" << endl;
                        bActiveTransactions = true;
                    }

                    if (bActiveTransactions)
                    {
                        suspendAnswer = AskSuspendQuestion(CmdID);
                        //					if (suspendAnswer == FORCE)
                        //					{
                        //						if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
                        //						{
                        //							break;
                        //						}
                        //					}
                        bNeedsConfirm = false;
                    }
                    else
                    {
                        suspendAnswer = FORCE;
                    }
                }

                if (suspendAnswer == CANCEL)
                {
                    // We're outa here.
                    break;
                }

                if (bNeedsConfirm)
                {
                    if (confirmPrompt(""))
                        break;
                }

                switch (suspendAnswer)
                {
                    case WAIT:
                        cout << endl << "   Waiting for all transactions to complete" << flush;
                        dbrm.setSystemSuspendPending(true, false);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case ROLLBACK:
                        cout << endl << "   Rollback of all transactions" << flush;
                        dbrm.setSystemSuspendPending(true, true);
                        gracefulTemp = GRACEFUL_WAIT;		// Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
                        break;

                    case FORCE:
                    case CANCEL:
                    default:
                        gracefulTemp = FORCEFUL;
                        break;
                }

                // stop writes to MariaDB ColumnStore Database
                oam.SuspendWrites(gracefulTemp, ackTemp);
            }
            catch (exception& e)
            {
                cout << endl << "**** stopDatabaseWrites Failed: " << e.what() << endl;
            }
            catch (...)
            {
                cout << endl << "**** stopDatabaseWrites Failed" << endl;
                break;
            }

            break;
        }

        case 33: // resumeDatabaseWrites
        {
            if ( arguments[1] != "y" )
            {
                if (confirmPrompt("This command resumes the DDL/DML writes to the MariaDB ColumnStore Database"))
                    break;
            }

            // resume writes to MariaDB ColumnStore Database

            try
            {
                SystemProcessStatus systemprocessstatus;
                BRM::DBRM dbrm;

                dbrm.setSystemSuspended(false);

                oam.getProcessStatus(systemprocessstatus);

                for ( unsigned int i = 0 ; i < systemprocessstatus.processstatus.size(); i++)
                {
                    if (systemprocessstatus.processstatus[i].ProcessName  == "DMLProc")
                    {
                        oam.setProcessStatus(systemprocessstatus.processstatus[i].ProcessName, systemprocessstatus.processstatus[i].Module, ACTIVE, 1);
                    }

                    if (systemprocessstatus.processstatus[i].ProcessName  == "DDLProc")
                    {
                        oam.setProcessStatus(systemprocessstatus.processstatus[i].ProcessName, systemprocessstatus.processstatus[i].Module, ACTIVE, 1);
                    }

                    if (systemprocessstatus.processstatus[i].ProcessName  == "WriteEngineServer")
                    {
                        oam.setProcessStatus(systemprocessstatus.processstatus[i].ProcessName, systemprocessstatus.processstatus[i].Module, ACTIVE, 1);
                    }
                }

                oam.setSystemStatus(ACTIVE);
                cout << endl << "Resume MariaDB ColumnStore Database Writes Request successfully completed" << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** resumeDatabaseWrites Failed: " << e.what() << endl;
            }
            catch (...)
            {
                cout << endl << "**** resumeDatabaseWrites Failed" << endl;
                break;
            }

            break;
        }

        case 34: // unassignDbrootPmConfig parameters: dbroot-list reside-pm
        {
            string DataRedundancyConfig = "n";

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if (DataRedundancyConfig == "y")
            {
                cout << endl << "**** unassignDbrootPmConfig : command not supported on Data Redundancy configured system. " << endl;
                break;
            }

            if ( localModule != parentOAMModule )
            {
                // exit out since not on active module
                cout << endl << "**** unassignDbrootPmConfig Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
                break;
            }


            if (arguments[2] == "")
            {
                // need atleast 2 arguments
                cout << endl << "**** unassignDbrootPmConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            string dbrootIDs = arguments[1];
            string residePM = arguments[2];

            if (arguments[2].find("pm") == string::npos )
            {
                cout << endl << "**** unassignDbrootPmConfig Failed : Parmameter 2 is not a Performance Module name, enter 'help' for additional information" << endl;
                break;
            }

            // check module status
            try
            {
                bool degraded;
                int opState;
                oam.getModuleStatus(residePM, opState, degraded);

                if (opState != oam::MAN_OFFLINE)
                {
                    cout << endl << "**** unassignDbrootPmConfig Failed, " + residePM + " has to be in a MAN_OFFLINE state" << endl;
                    break;
                }

            }
            catch (exception& ex)
            {}

            DBRootConfigList dbrootlist;

            boost::char_separator<char> sep(", ");
            boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);

            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                    it != tokens.end();
                    ++it)
            {
                dbrootlist.push_back(atoi((*it).c_str()));
            }

            cout << endl;

            //get dbroots ids for reside PM
            try
            {
                oam.unassignDbroot(residePM, dbrootlist);

                cout << endl << "   Successfully Unassigned DBRoots " << endl << endl;

            }
            catch (exception& e)
            {
                cout << endl << "**** Failed Unassign of DBRoots: " << e.what() << endl;
                break;
            }
        }
        break;

        case 35: // assignDbrootPmConfig parameters: pm dbroot-list
        {
            string DataRedundancyConfig = "n";

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if (DataRedundancyConfig == "y")
            {
                cout << endl << "**** assignDbrootPmConfig : command not supported on Data Redundancy configured system. " << endl;
                break;
            }

            if ( localModule != parentOAMModule )
            {
                // exit out since not on active module
                cout << endl << "**** assignDbrootPmConfig Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
                break;
            }

            //check the system status / service status and only allow command when System is MAN_OFFLINE
            if (!oam.checkSystemRunning())
            {
                cout << endl << "**** assignDbrootPmConfig Failed,  System is down. Needs to be running" << endl;
                break;
            }

            if (arguments[2] == "")
            {
                // need atleast 2 arguments
                cout << endl << "**** assignDbrootPmConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            string dbrootIDs = arguments[1];
            string toPM = arguments[2];

            if (arguments[2].find("pm") == string::npos )
            {
                cout << endl << "**** assignDbrootPmConfig Failed : Parmameter 2 is not a Performance Module name, enter 'help' for additional information" << endl;
                break;
            }

            // check module status
            try
            {
                bool degraded;
                int opState;
                oam.getModuleStatus(toPM, opState, degraded);

                if (opState == oam::AUTO_DISABLED ||
                        opState == oam::MAN_DISABLED)
                {
                    cout << "**** assignDbrootPmConfig Failed: " << toPM << " is DISABLED." << endl;
                    cout << "Run alterSystem-EnableModule to enable module" << endl;
                    break;
                }

                if (!opState == oam::MAN_OFFLINE)
                {
                    cout << "**** assignDbrootPmConfig Failed: " << toPM << " needs to be MAN_OFFLINE." << endl;
                    break;
                }
            }
            catch (exception& ex)
            {}

            DBRootConfigList dbrootlist;

            boost::char_separator<char> sep(", ");
            boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);

            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                    it != tokens.end();
                    ++it)
            {
                dbrootlist.push_back(atoi((*it).c_str()));
            }

            cout << endl;

            //get dbroots ids for reside PM
            try
            {
                oam.assignDbroot(toPM, dbrootlist);

                cout << endl << "   Successfully Assigned DBRoots " << endl << endl;

                try
                {
                    string DBRootStorageType;
                    oam.getSystemConfig("DBRootStorageType", DBRootStorageType);

                    if (DBRootStorageType == "external" )
                    {
                        string DataRedundancyConfig = "n";
                        string cloud = oam::UnassignedName;

                        try
                        {
                            oam.getSystemConfig("Cloud", cloud);
                            oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
                        }
                        catch (...)
                        {}

                        if ( DataRedundancyConfig == "n" && cloud == oam::UnassignedName)
                            cout << "   REMINDER: Update the /etc/fstab on " << toPM << " to include these dbroot mounts" << endl << endl;

                        break;

                    }
                }
                catch (...) {}

            }
            catch (exception& e)
            {
                cout << endl << "**** Failed Assign of DBRoots: " << e.what() << endl;
                break;
            }
        }
        break;

        case 36: // getAlarmSummary
        {
            printAlarmSummary();
        }
        break;

        case 37: // getSystemInfo
        {
            try
            {
                printSystemStatus();
            }
            catch (...)
            {
                break;
            }

            try
            {
                printProcessStatus();
            }
            catch (...)
            {
                break;
            }

            printAlarmSummary();
        }
        break;

        case 38: // getModuleConfig
        {
            SystemModuleTypeConfig systemmoduletypeconfig;
            ModuleTypeConfig moduletypeconfig;
            ModuleConfig moduleconfig;
            systemmoduletypeconfig.moduletypeconfig.clear();
            string returnValue;
            string Argument;

            if (arguments[1] == "all" || arguments[1] == "")
            {

                // get and all display Module Name config parameters

                try
                {
                    oam.getSystemConfig(systemmoduletypeconfig);

                    cout << endl << "Module Name Configuration" << endl;

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                            // end of list
                            break;

                        int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                        if ( moduleCount == 0 )
                            // skip if no modules
                            continue;

                        string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;

                        DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                        {
                            string modulename = (*pt).DeviceName;
                            string moduleID = modulename.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);
                            cout << endl << "Module '" << modulename	<< "' Configuration information" << endl << endl;

                            cout << "ModuleType = " << moduletype << endl;
                            cout << "ModuleDesc = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc << " #" << moduleID << endl;

                            HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                            for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                            {
                                cout << "ModuleIPAdd NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).IPAddr << endl;
                                cout << "ModuleHostName NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).HostName << endl;
                            }

                            DeviceDBRootList::iterator pt3 = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.begin();

                            for ( ; pt3 != systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.end() ; pt3++)
                            {
                                if ( (*pt3).DeviceID == atoi(moduleID.c_str()) )
                                {
                                    cout << "DBRootIDs assigned  = ";
                                    DBRootConfigList::iterator pt2 = (*pt3).dbrootConfigList.begin();

                                    for ( ; pt2 != (*pt3).dbrootConfigList.end() ;)
                                    {
                                        cout << oam.itoa(*pt2);
                                        pt2++;

                                        if (pt2 != (*pt3).dbrootConfigList.end() )
                                            cout << ", ";
                                    }

                                    cout << endl;
                                }
                            }
                        }
                    }
                }
                catch (exception& e)
                {
                    cout << endl << "**** getModuleConfig Failed =  " << e.what() << endl;
                }
            }
            else
            {
                // get a single module name info
                if (arguments[2] == "")
                {
                    try
                    {
                        oam.getSystemConfig(arguments[1], moduleconfig);

                        cout << endl << "Module Name Configuration for " << arguments[1] << endl << endl;

                        cout << "ModuleType = " << moduleconfig.ModuleType << endl;
                        cout << "ModuleDesc = " << moduleconfig.ModuleDesc << endl;
                        HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();

                        for ( ; pt1 != moduleconfig.hostConfigList.end() ; pt1++)
                        {
                            cout << "ModuleIPAdd NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).IPAddr << endl;
                            cout << "ModuleHostName NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).HostName << endl;
                        }

                        if ( moduleconfig.ModuleType == "pm" )
                        {

                            cout << "DBRootIDs assigned  = ";

                            DBRootConfigList::iterator pt2 = moduleconfig.dbrootConfigList.begin();

                            for ( ; pt2 != moduleconfig.dbrootConfigList.end() ; )
                            {
                                cout << oam.itoa(*pt2);
                                pt2++;

                                if (pt2 != moduleconfig.dbrootConfigList.end())
                                    cout << ", ";
                            }

                            cout << endl << endl;
                        }
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** getModuleConfig Failed =  " << e.what() << endl;
                    }
                }
                else
                {
                    // get a parameter for a module
                    // get module ID from module name entered, then get parameter
                    oam.getSystemConfig(systemmoduletypeconfig);

                    cout << endl;
                    bool found = false;

                    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                    {
                        string moduleType = arguments[1].substr(0, MAX_MODULE_TYPE_SIZE);
                        string moduleID = arguments[1].substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);

                        int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                        if ( moduleCount == 0 )
                            // skip if no modules
                            continue;

                        if (systemmoduletypeconfig.moduletypeconfig[i].ModuleType == moduleType )
                        {
                            DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                            for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                            {
                                if ( (*pt).DeviceName != arguments[1] )
                                    continue;

                                found = true;

                                if ( arguments[2] == "ModuleIPAdd" || arguments[2] == "ModuleHostName")
                                {
                                    HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                                    for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                                    {
                                        if ( arguments[2] == "ModuleIPAdd" )
                                            cout << "ModuleIPAdd NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).IPAddr << endl;
                                        else
                                            cout << "ModuleHostName NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).HostName << endl;
                                    }
                                }
                                else
                                {
                                    Argument = arguments[2] + oam.itoa(i + 1);

                                    try
                                    {
                                        oam.getSystemConfig(Argument, returnValue);
                                        cout << endl << "   " << arguments[2] << " = " << returnValue << endl << endl;
                                        break;
                                    }
                                    catch (exception& e)
                                    {
                                        cout << endl << "**** getModuleConfig Failed =  " << e.what() << endl;
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    if ( !found )
                    {
                        // module name not found
                        cout << endl << "**** getModuleConfig Failed : Invalid Module Name" << endl;
                        break;
                    }

                    cout << endl;
                }
            }
        }
        break;

        case 39: // getSystemDirectories
        {
			cout << endl << "System Installation and Temporary File Directories" << endl << endl;
			
			cout << "System Installation Directory = " << installDir << endl;
			cout << "System Temporary File Directory = " << tmpDir << endl << endl;
        }
        break;

        case 40:
        {
        }
        break;

        case 41:
        {
        }
        break;

        case 42:
        {
        }
        break;

        case 43: // assignElasticIPAddress
        {
            //get cloud configuration data
            string cloud = oam::UnassignedName;

            try
            {
                oam.getSystemConfig("Cloud", cloud);
            }
            catch (...) {}

            if ( cloud == oam::UnassignedName )
            {
                cout << endl << "**** assignElasticIPAddress Not Supported : For Amazon Systems only" << endl;
                break;
            }

            if (arguments[2] == "")
            {
                // need 2 arguments
                cout << endl << "**** assignElasticIPAddress Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** assignElasticIPAddress Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            string IPaddress = arguments[1];
            string moduleName = arguments[2];

            if ( oam.validateModule(moduleName) != API_SUCCESS)
            {
                cout << endl << "**** assignElasticIPAddress Failed : Invalid Module name" << endl;
                break;
            }

            if ( moduleName == localModule )
            {
                if ( arguments[3] != "y")
                {
                    string warning = "Warning: Assigning Elastic IP Address to local module will lock up this terminal session.";

                    // confirm request
                    if (confirmPrompt(warning))
                        break;
                }
            }

            //check and add Elastic IP Address
            int AmazonElasticIPCount = 0;

            try
            {
                oam.getSystemConfig("AmazonElasticIPCount", AmazonElasticIPCount);
            }
            catch (...)
            {
                AmazonElasticIPCount = 0;
            }

            bool found = false;
            int id = 1;

            for (  ; id < AmazonElasticIPCount + 1 ; id++ )
            {
                string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
                string ELmoduleName;
                string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
                string ELIPaddress;

                try
                {
                    oam.getSystemConfig(AmazonElasticModule, ELmoduleName);
                    oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
                }
                catch (...) {}

                if ( ELmoduleName == moduleName &&
                        ELIPaddress == IPaddress)
                {
                    //assign again incase it got unconnected
                    //get instance id
                    string instanceName = oam::UnassignedName;

                    try
                    {
                        ModuleConfig moduleconfig;
                        oam.getSystemConfig(moduleName, moduleconfig);
                        HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
                        instanceName = (*pt1).HostName;
                    }
                    catch (...)
                    {}

                    try
                    {
                        oam.assignElasticIP(instanceName, IPaddress);
                        cout << endl << "   Successfully completed Assigning Elastic IP Address " << endl << endl;
                    }
                    catch (...) {}

                    found = true;
                    break;
                }

                if ( ELmoduleName == moduleName )
                {
                    cout << endl << "**** assignElasticIPAddress Failed : module already assigned IP Address " << ELIPaddress << endl;
                    found = true;
                    break;
                }

                if ( ELIPaddress == IPaddress )
                {
                    cout << endl << "**** assignElasticIPAddress Failed : IP Address already assigned to module " << ELmoduleName << endl;
                    found = true;
                    break;
                }
            }

            if (found)
                break;

            AmazonElasticIPCount++;

            //get instance id
            string instanceName = oam::UnassignedName;

            try
            {
                ModuleConfig moduleconfig;
                oam.getSystemConfig(moduleName, moduleconfig);
                HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
                instanceName = (*pt1).HostName;
            }
            catch (...)
            {}

            try
            {
                oam.assignElasticIP(instanceName, IPaddress);
            }
            catch (...)
            {
                cout << endl << "**** assignElasticIPAddress Failed : assignElasticIP API Error" << endl;
                break;
            }

            //add to configuration
            string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
            string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);

            Config* sysConfig = Config::makeConfig();

            try
            {
                sysConfig->setConfig("Installation", "AmazonElasticIPCount", oam.itoa(AmazonElasticIPCount));
                sysConfig->setConfig("Installation", AmazonElasticModule, moduleName);
                sysConfig->setConfig("Installation", AmazonElasticIPAddr, IPaddress);
                sysConfig->write();
            }
            catch (...)
            {
                cout << "ERROR: Problem setting AmazonElasticModule in the MariaDB ColumnStore System Configuration file" << endl;
                break;
            }

            cout << endl << "   Successfully completed Assigning Elastic IP Address " << endl << endl;
        }
        break;

        case 44: // unassignElasticIPAddress
        {
            //get cloud configuration data
            string cloud = oam::UnassignedName;

            try
            {
                oam.getSystemConfig("Cloud", cloud);
            }
            catch (...) {}

            if ( cloud == oam::UnassignedName )
            {
                cout << endl << "**** unassignElasticIPAddress Not Supported : For Amazon Systems only" << endl;
                break;
            }

            if (arguments[1] == "")
            {
                // need 2 arguments
                cout << endl << "**** unassignElasticIPAddress Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** unassignElasticIPAddress Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            string IPaddress = arguments[1];

            //check and add Elastic IP Address
            int AmazonElasticIPCount = 0;

            try
            {
                oam.getSystemConfig("AmazonElasticIPCount", AmazonElasticIPCount);
            }
            catch (...)
            {
                AmazonElasticIPCount = 0;
            }

            bool found = false;
            int id = 1;

            for (  ; id < AmazonElasticIPCount + 1 ; id++ )
            {
                string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
                string ELmoduleName;
                string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
                string ELIPaddress;

                try
                {
                    oam.getSystemConfig(AmazonElasticIPAddr, ELmoduleName);
                    oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
                }
                catch (...) {}

                if ( ELIPaddress == IPaddress )
                {
                    found = true;

                    try
                    {
                        oam.deassignElasticIP(IPaddress);
                    }
                    catch (...)
                    {
                        cout << endl << "**** deassignElasticIPAddress Failed : deassignElasticIP API Error";
                        break;
                    }

                    int oldAmazonElasticIPCount = AmazonElasticIPCount;

                    Config* sysConfig = Config::makeConfig();

                    //move up any others
                    if ( oldAmazonElasticIPCount > id )
                    {
                        for ( int newid = id + 1 ; newid < oldAmazonElasticIPCount + 1 ; newid++ )
                        {
                            AmazonElasticModule = "AmazonElasticModule" + oam.itoa(newid);
                            AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(newid);

                            try
                            {
                                oam.getSystemConfig(AmazonElasticModule, ELmoduleName);
                                oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
                            }
                            catch (...) {}

                            AmazonElasticModule = "AmazonElasticModule" + oam.itoa(newid - 1);
                            AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(newid - 1);

                            try
                            {
                                oam.setSystemConfig(AmazonElasticModule, ELmoduleName);
                                oam.setSystemConfig(AmazonElasticIPAddr, ELIPaddress);
                            }
                            catch (...) {}
                        }
                    }

                    AmazonElasticModule = "AmazonElasticModule" + oam.itoa(oldAmazonElasticIPCount);
                    AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(oldAmazonElasticIPCount);

                    //delete last entry and update count
                    AmazonElasticIPCount--;

                    try
                    {
                        sysConfig->setConfig("Installation", "AmazonElasticIPCount", oam.itoa(AmazonElasticIPCount));
                        sysConfig->delConfig("Installation", AmazonElasticModule);
                        sysConfig->delConfig("Installation", AmazonElasticIPAddr);
                        sysConfig->write();
                    }
                    catch (...)
                    {
                        cout << "ERROR: Problem setting AmazonElasticModule in the MariaDB ColumnStore System Configuration file" << endl;
                        break;
                    }
                }
            }

            if (!found)
            {
                cout << endl << "   Elastic IP Address " << IPaddress << " not assigned to a module" << endl << endl;
                break;
            }

            cout << endl << "   Successfully completed Unassigning Elastic IP Address " << endl << endl;

        }
        break;

        case 45: // getSystemNetworkConfig
        {
            // get and display Module Network Config
            SystemModuleTypeConfig systemmoduletypeconfig;
            systemmoduletypeconfig.moduletypeconfig.clear();

            //check and add Elastic IP Address
            int AmazonElasticIPCount = 0;

            try
            {
                oam.getSystemConfig("AmazonElasticIPCount", AmazonElasticIPCount);
            }
            catch (...)
            {
                AmazonElasticIPCount = 0;
            }

            // get max length of a host name for header formatting

            int maxSize = 9;

            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);

                for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                {
                    if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                        // end of list
                        break;

                    int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
                    string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
                    string moduletypedesc = systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc;

                    if ( moduleCount > 0 )
                    {
                        DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                        {
                            HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                            for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                            {
                                if ( maxSize < (int) (*pt1).HostName.size() )
                                    maxSize = (*pt1).HostName.size();
                            }
                        }
                    }
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** getSystemNetworkConfig Failed =  " << e.what() << endl;
            }

            cout << endl << "System Network Configuration" << endl << endl;

            cout.setf(ios::left);
            cout.width(15);
            cout << "Module Name";
            cout.width(30);
            cout << "Module Description";
            cout.width(10);
            cout << "NIC ID";
            cout.width(maxSize + 5);
            cout << "Host Name";
            cout.width(20);
            cout << "IP Address";
            cout.width(14);

            if ( AmazonElasticIPCount > 0 )
            {
                cout.width(20);
                cout << "Elastic IP Address";
            }

            cout << endl;
            cout.width(15);
            cout << "-----------";
            cout.width(30);
            cout << "-------------------------";
            cout.width(10);
            cout << "------";

            for ( int i = 0 ; i < maxSize ; i++ )
            {
                cout << "-";
            }

            cout << "     ";
            cout.width(20);
            cout << "---------------";

            if ( AmazonElasticIPCount > 0 )
            {
                cout.width(20);
                cout << "------------------";
            }

            cout << endl;

            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);

                for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                {
                    if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                        // end of list
                        break;

                    int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
                    string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
                    string moduletypedesc = systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc;

                    if ( moduleCount > 0 )
                    {
                        DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                        {
                            string modulename = (*pt).DeviceName;
                            string moduleID = modulename.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);
                            string modulenamedesc = moduletypedesc + " #" + moduleID;

                            cout.setf(ios::left);
                            cout.width(15);
                            cout << modulename;
                            cout.width(33);
                            cout << modulenamedesc;

                            HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                            for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                            {
                                string ipAddr = (*pt1).IPAddr;
                                string hostname = (*pt1).HostName;
                                string nicID = oam.itoa((*pt1).NicID);

                                if ( nicID != "1" )
                                {
                                    cout.width(48);
                                    cout << " ";
                                }

                                cout.width(7);
                                cout << nicID;
                                cout.width(maxSize + 5);
                                cout << hostname;
                                cout.width(20);
                                cout << ipAddr;
                                cout.width(14);

                                if ( nicID == "1" && AmazonElasticIPCount > 0 )
                                {
                                    int id = 1;

                                    for (  ; id < AmazonElasticIPCount + 1 ; id++ )
                                    {
                                        string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
                                        string ELmoduleName;
                                        string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
                                        string ELIPaddress;

                                        try
                                        {
                                            oam.getSystemConfig(AmazonElasticModule, ELmoduleName);
                                            oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
                                        }
                                        catch (...) {}

                                        if ( modulename == ELmoduleName )
                                        {
                                            cout.width(20);
                                            cout << ELIPaddress;
                                            break;
                                        }
                                    }
                                }

                                cout << endl;
                            }
                        }
                    }
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** getSystemNetworkConfig Failed =  " << e.what() << endl;
            }

            //get cloud configuration data
            string cloud = oam::UnassignedName;

            try
            {
                oam.getSystemConfig("Cloud", cloud);
            }
            catch (...) {}

            if ( cloud == "amazon-ec2" ||  cloud == "amazon-vpc" )
            {
                cout << endl << "Amazon Instance Configuration" << endl << endl;

                string PMInstanceType = oam::UnassignedName;
                string UMInstanceType = oam::UnassignedName;

                try
                {
                    oam.getSystemConfig("PMInstanceType", PMInstanceType);
                    oam.getSystemConfig("UMInstanceType", UMInstanceType);

                    cout << "PMInstanceType = " << PMInstanceType << endl;
                    cout << "UMInstanceType = " << UMInstanceType << endl;
                }
                catch (...) {}

            }

            cout << endl;

            break;
        }

        case 46: // enableReplication
        {
            if ( SingleServerInstall == "y" )
            {
                // exit out since not on single-server install
                cout << endl << "**** enableReplication Failed : not supported on a Single-Server type installs  " << endl;
                break;
            }

            string MySQLRep;

            try
            {
                oam.getSystemConfig("MySQLRep", MySQLRep);
            }
            catch (...) {}

            if ( MySQLRep == "y" )
            {
                string warning = "MariaDB ColumnStore Replication Feature is already enabled";

                // confirm request
                if (confirmPrompt(warning))
                    break;
            }

            string password;

            if ( arguments[1] == "")
            {
                cout << endl;
                string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
                password = dataPrompt(prompt);
            }
            else
                password = arguments[1];

            if ( password == "")
                password = oam::UnassignedName;

            //set flag
            try
            {
                oam.setSystemConfig("MySQLRep", "y");
                sleep(2);
            }
            catch (...) {}

            try
            {
                oam.enableMySQLRep(password);
                cout << endl << "   Successful Enabling of MariaDB ColumnStore Replication " << endl << endl;

                //display Primary UM Module / Master Node
                string PrimaryUMModuleName;

                try
                {
                    oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
                }
                catch (...) {}

                cout << "   MariaDB ColumnStore Replication Master Node is " << PrimaryUMModuleName << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** enableRep Failed :  " << e.what() << endl;
            }

            break;
        }

        case 47: // getSoftwareInfo
        {
            cout << endl;

            if ( rootUser)
            {
				string logFile = tmpDir + "/columnstore.log";
				string cmd = "rpm -qi mariadb-columnstore-platform > " + logFile + " 2>&1";
                int rtnCode = system(cmd.c_str());

                if (WEXITSTATUS(rtnCode) == 0)
                {
					string cmd = "cat " + logFile;
                    system(cmd.c_str());
				}
                else
                {
					string cmd = "dpkg -s mariadb-columnstore-platform > " + logFile + " 2>&1";
                    rtnCode =  system(cmd.c_str());

                    if (WEXITSTATUS(rtnCode) == 0)
                    {
						string cmd = "cat " + logFile;
						system(cmd.c_str());
					}
                   else
                    {
                        cout << "SoftwareVersion = " << columnstore_version << endl;
                        cout << "SoftwareRelease = " << columnstore_release << endl;
                    }
                }
            }
            else
            {
                cout << "SoftwareVersion = " << columnstore_version << endl;
                cout << "SoftwareRelease = " << columnstore_release << endl;
            }

            cout << endl;
            break;
        }

        case 48: // addModule - parameters: Module type/Module Name, Number of Modules, Server Hostnames,
            // Server root password optional
        {
            Config* sysConfig = Config::makeConfig();

            if ( SingleServerInstall == "y" )
            {
                // exit out since not on single-server install
                cout << endl << "**** addModule Failed : not support on a Single-Server type installs  " << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** addModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[1] == "")
            {
                // need at least  arguments
                cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            switch ( serverInstallType )
            {
                case (oam::INSTALL_COMBINE_DM_UM_PM):
                {
                    if (arguments[1].find("um") != string::npos )
                    {
                        cout << endl << "**** addModule Failed : User Module Types not supported on this Combined Server Installation" << endl;
                        return (0);
                    }

                    break;
                }
            }

            string DataRedundancyConfig = "n";
            int DataRedundancyCopies;
            string cloud = oam::UnassignedName;
            int DataRedundancyNetworkType;
            int DataRedundancyStorageType;
            string AmazonVPCNextPrivateIP;
            string DistributedInstall = "n";

            try
            {
                oam.getSystemConfig("Cloud", cloud);
                oam.getSystemConfig("AmazonVPCNextPrivateIP", AmazonVPCNextPrivateIP);
                oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
                oam.getSystemConfig("DataRedundancyCopies", DataRedundancyCopies);
                oam.getSystemConfig("DataRedundancyNetworkType", DataRedundancyNetworkType);
                oam.getSystemConfig("DataRedundancyStorageType", DataRedundancyStorageType);
                oam.getSystemConfig("DistributedInstall", DistributedInstall);
            }
            catch (...) {}

            ModuleTypeConfig moduletypeconfig;
            DeviceNetworkConfig devicenetworkconfig;
            DeviceNetworkList devicenetworklist;
            DeviceNetworkList enabledevicenetworklist;
            HostConfig hostconfig;

            string moduleType;
            string moduleName;
            int moduleCount;
            string password = "ssh";
            typedef std::vector<string> inputNames;
            inputNames inputnames;
            typedef std::vector<string> umStorageNames;
            umStorageNames umstoragenames;
            int hostArg;
            int dbrootPerPM = 0;

            //check if module type or module name was entered
            if ( arguments[1].size() == 2 )
            {
                //Module Type was entered
                if (arguments[3] == "" && cloud == oam::UnassignedName)
                {
                    // need at least  arguments
                    cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                    break;
                }

                //Module Type was entered
                moduleType = arguments[1];
                moduleCount = atoi(arguments[2].c_str());
                hostArg = 3;

                //check for a non-distrubuted install setup, dont need password
                if ( DistributedInstall != "y" )
                {
                    if (arguments[4] != "")
                        password = arguments[4];
                    else
                    {
                        cout << endl;
                        string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
                        password = dataPrompt(prompt);
                    }
                }

                if (arguments[5] != "")
                    dbrootPerPM = atoi(arguments[5].c_str());
            }
            else
            {
                //Module Name was entered
                if (arguments[2] == "" && cloud == oam::UnassignedName)
                {
                    // need at least  arguments
                    cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                    break;
                }

                moduleName = arguments[1];
                moduleType = arguments[1].substr(0, MAX_MODULE_TYPE_SIZE);
                moduleCount = 1;
                hostArg = 2;

                //check for a non-distrubuted install setup, dont need password
                if ( DistributedInstall != "y" )
                {
                    if (arguments[3] != "")
                        password = arguments[3];
                    else
                    {
                        cout << endl;
                        string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
                        password = dataPrompt(prompt);
                    }
                }

                if (arguments[4] != "")
                    dbrootPerPM = atoi(arguments[4].c_str());
            }

//do we needed this check????
            if ( moduleCount < 1 || moduleCount > 10  )
            {
                cout << endl << "**** addModule Failed : Failed to Add Module, invalid number-of-modules entered (1-10)" << endl;
                break;
            }

            if ( DataRedundancyConfig == "y" && moduleType == "pm" )
            {
                if ( localModule != parentOAMModule )
                {
                    // exit out since not on active module
                    cout << endl << "**** addModule Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
                    break;
                }

                if ( fmod((float) moduleCount, (float) DataRedundancyCopies) != 0 )
                {
                    cout << endl << "**** addModule Failed : Failed to Add Module, invalid number-of-modules: must be multiple of Data Redundancy Copies, which is " << DataRedundancyCopies << endl;
                    break;
                }
            }

            //check and parse input Hostname/VPC-IP Addresses
            if (arguments[hostArg] != "")
            {
                boost::char_separator<char> sep(", ");
                boost::tokenizer< boost::char_separator<char> > tokens(arguments[hostArg], sep);

                for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                        it != tokens.end();
                        ++it)
                {
                    inputnames.push_back(*it);
                }
            }

            if ( inputnames.size() < (unsigned) moduleCount )
            {
                if ( cloud == oam::UnassignedName )
                {
                    cout << endl << "**** addModule Failed : Failed to Add Module, number of hostnames is less than Module Count" << endl;
                    break;
                }
                else
                {
                    if ( cloud == "amazon-ec2" )
                    {
                        cout << endl << "Launching new Instance(s)" << endl;

                        for ( int id = inputnames.size() ; id < moduleCount ; id++ )
                        {
                            inputnames.push_back(oam::UnassignedName);
                        }
                    }
                    else
                    {
                        // amazon-vpc
                        if ( inputnames.size() == 0 )
                        {
                            if ( AmazonVPCNextPrivateIP == oam::UnassignedName)
                            {
                                cout << endl << "**** addModule Failed : Failed to Add Module, enter VPC Private IP Address" << endl;
                                break;
                            }
                            else
                            {
                                if ( AmazonVPCNextPrivateIP == "autoassign")
                                {
                                    for ( int id = inputnames.size() ; id < moduleCount ; id++ )
                                    {
                                        inputnames.push_back("autoassign");
                                    }
                                }
                                else
                                {
                                    for ( int id = inputnames.size() ; id < moduleCount ; id++ )
                                    {
                                        inputnames.push_back(AmazonVPCNextPrivateIP);

                                        try
                                        {
                                            AmazonVPCNextPrivateIP = oam.incrementIPAddress(AmazonVPCNextPrivateIP);
                                        }
                                        catch (...)
                                        {
                                            cout << endl << "ERROR: incrementIPAddress API error, check logs" << endl;
                                            exit(1);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //get configured moduleNames
            try
            {
                oam.getSystemConfig(moduleType, moduletypeconfig);
            }
            catch (...)
            {
                cout << endl << "**** addModule Failed : Failed to Add Module, getSystemConfig API Failed" << endl;
                break;
            }

            //get module names already in-use and Number of NIC IDs for module
            typedef std::vector<string>	moduleNameList;
            moduleNameList modulenamelist;
            int nicNumber = 1;

            DeviceNetworkList::iterator pt = moduletypeconfig.ModuleNetworkList.begin();

            for ( ; pt != moduletypeconfig.ModuleNetworkList.end() ; pt++)
            {
                modulenamelist.push_back((*pt).DeviceName);
                HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                {
                    if ( (*pt1).HostName != oam::UnassignedName )
                    {
                        if ( nicNumber < (*pt1).NicID )
                            nicNumber = (*pt1).NicID;
                    }
                }
            }

            if ( ((unsigned) nicNumber * moduleCount) != inputnames.size() && cloud == oam::UnassignedName )
            {
                cout << endl << "**** addModule Failed : Failed to Add Module, invalid number of hostNames entered. Enter " + oam.itoa(nicNumber * moduleCount) +  " hostname(s), which is the number of NICs times the number of modules" << endl;
                break;
            }

            int moduleID = 1;
            inputNames::const_iterator listPT1 = inputnames.begin();
            umStorageNames::const_iterator listPT2 = umstoragenames.begin();

            for ( int i = 0 ; i < moduleCount ; i++ )
            {
                string dataDupIPaddr = "ModuleIPAddr" + oam.itoa(moduleID) + "-1-3";
                string dataDupHostName = "ModuleHostName" + oam.itoa(moduleID) + "-1-3";
                //validate or determine module name
                moduleNameList::const_iterator listPT = modulenamelist.begin();

                for ( ; listPT != modulenamelist.end() ; listPT++)
                {
                    if ( !moduleName.empty() )
                    {
                        //add by moduleName, validate that Entered module name doesn't exist
                        if ( moduleName == (*listPT) )
                        {
                            cout << endl << "**** addModule Failed : Module Name already exist" << endl;
                            return 1;
                        }
                    }
                    else
                    {
                        //add by moduleType, get available module name
                        string newModuleName = moduleType + oam.itoa(moduleID);

                        if ( newModuleName == (*listPT) )
                            moduleID++;
                        else
                        {
                            moduleName = newModuleName;
                            moduleID++;
                            break;
                        }
                    }
                }

                if ( moduleName.empty() )
                {
                    moduleName = moduleType + oam.itoa(moduleID);
                    moduleID++;
                }

                // store module name
                devicenetworkconfig.DeviceName = moduleName;
                enabledevicenetworklist.push_back(devicenetworkconfig);

                for ( int j = 0 ; j < nicNumber ; j ++ )
                {
                    //get/check Server Hostnames IP address
                    string hostName;
                    string IPAddress;

                    if ( cloud == "amazon-ec2")
                    {
                        hostName = *listPT1;

                        if ( hostName != oam::UnassignedName )
                        {
                            IPAddress = oam.getEC2InstanceIpAddress(hostName);

                            if (IPAddress == "stopped" || IPAddress == "terminated")
                            {
                                cout << "ERROR: Instance " + hostName + " not running, please start and retry" << endl << endl;
                                return 1;
                            }
                        }
                        else
                            IPAddress = oam::UnassignedName;
                    }
                    else
                    {
                        if ( cloud == "amazon-vpc")
                        {
                            if ( *listPT1 != "autoassign" )
                            {
                                if ( oam.isValidIP(*listPT1) )
                                {
                                    //ip address entered
                                    hostName = oam::UnassignedName;
                                    IPAddress = *listPT1;
                                }
                                else
                                {
                                    //instance id entered
                                    hostName = *listPT1;
                                    IPAddress = oam.getEC2InstanceIpAddress(hostName);

                                    if (IPAddress == "stopped" || IPAddress == "terminated")
                                    {
                                        cout << "ERROR: Instance " + hostName + " not running, please start and retry" << endl << endl;
                                        return 1;
                                    }
                                }
                            }
                            else
                            {
                                hostName = oam::UnassignedName;
                                IPAddress = "autoassign";
                            }
                        }
                        else
                        {
                            // non-amazon
                            hostName = *listPT1;
                            IPAddress = oam.getIPAddress(hostName);

                            if ( IPAddress.empty() )
                            {
                                // prompt for IP Address
                                string prompt = "IP Address of " + hostName + " not found, enter IP Address or enter 'abort'";
                                IPAddress = dataPrompt(prompt);

                                if ( IPAddress == "abort" || !oam.isValidIP(IPAddress))
                                    return 1;
                            }
                        }
                    }

                    if ( DataRedundancyConfig == "y")
                    {
                        string errmsg1;
                        string errmsg2;
                        int ret = oam.glusterctl(oam::GLUSTER_PEERPROBE, IPAddress, password, errmsg2);

                        if ( ret != 0 )
                        {
                            return 1;
                        }
                    }

                    hostconfig.IPAddr = IPAddress;
                    hostconfig.HostName = hostName;
                    hostconfig.NicID = j + 1;
                    devicenetworkconfig.hostConfigList.push_back(hostconfig);
                    listPT1++;
                }

                devicenetworklist.push_back(devicenetworkconfig);
                devicenetworkconfig.hostConfigList.clear();
                moduleName.clear();

                if ( DataRedundancyConfig == "y" && DataRedundancyNetworkType == 2 && moduleType == "pm")
                {
                    string DataRedundancyIPAddress = sysConfig->getConfig("DataRedundancyConfig", dataDupIPaddr);
                    string DataRedundancyHostname = sysConfig->getConfig("DataRedundancyConfig", dataDupHostName);

                    if (DataRedundancyIPAddress.empty() || DataRedundancyHostname.empty())
                    {
                        string prompt = "DataRedundancy is configured for dedicated network, enter a hostname";
                        DataRedundancyHostname = dataPrompt(prompt);
                        DataRedundancyIPAddress = oam.getIPAddress(DataRedundancyHostname);

                        if ( DataRedundancyIPAddress.empty() )
                        {
                            // prompt for IP Address
                            string prompt = "IP Address of " + DataRedundancyHostname + " not found, enter IP Address";
                            DataRedundancyIPAddress = dataPrompt(prompt);

                            if (!oam.isValidIP(DataRedundancyIPAddress))
                                return 1;
                        }

                        sysConfig->setConfig("DataRedundancyConfig", dataDupHostName, DataRedundancyHostname);
                        sysConfig->setConfig("DataRedundancyConfig", dataDupIPaddr, DataRedundancyIPAddress);
                    }
                }
            }

            DBRootConfigList dbrootlist;
            int dbrootNumber = -1;
            typedef std::vector<string>	storageDeviceList;
            storageDeviceList storagedevicelist;
            string deviceType;

            if ( DataRedundancyConfig == "y" && moduleType == "pm")
            {
                cout << endl << "Data Redundancy storage will be expanded when module(s) are added." << endl;

                if ( dbrootPerPM == 0)
                {
                    cout << endl;
                    // prompt for number of DBRoot
                    string prompt = "Number of DBRoots Per Performance Module you want to add";
                    dbrootPerPM = atoi(dataPrompt(prompt).c_str());
                }
                else
                    cout << endl << "Number of DBRoots Per Performance Module to be added is " << oam.itoa(dbrootPerPM) << endl;

                dbrootNumber = dbrootPerPM * moduleCount;

                if ( DataRedundancyStorageType == 2 )
                {
                    cout << endl << "Data Redundancy Storage Type is configured for 'storage'" << endl;

                    cout << "You will need " << oam.itoa(dbrootNumber * DataRedundancyCopies);
                    cout << " total storage locations and " << oam.itoa(dbrootPerPM * DataRedundancyCopies) << " storage locations per PM. You will now " << endl;
                    cout << "be asked to enter the device names for the storage locations. You will enter " << endl;
                    cout << "them for each PM, on one line, separated by spaces (" << oam.itoa(dbrootPerPM * DataRedundancyCopies) << " names on each line)." << endl;

                    DeviceNetworkList::iterator pt = devicenetworklist.begin();
                    string firstPM = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);

                    for ( ; pt != devicenetworklist.end() ; pt++)
                    {
                        cout << endl;
                        string prompt = "Storage Device Names for " + (*pt).DeviceName;
                        string devices = dataPrompt(prompt);
                        storagedevicelist.push_back(devices);
                    }

                    cout << endl;
                    string prompt = "Filesystem type for these storage locations (ext2,ext3,xfs,etc)";
                    deviceType = dataPrompt(prompt);
                }

            }

            string mysqlpassword = oam::UnassignedName;

            try
            {
                cout << endl << "Adding Modules ";
                DeviceNetworkList::iterator pt = devicenetworklist.begin();
                string firstPM = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);

                for ( ; pt != devicenetworklist.end() ; pt++)
                {
                    cout << (*pt).DeviceName << ", ";
                }

                cout << "please wait..." << endl;

                oam.addModule(devicenetworklist, password, mysqlpassword);

                cout << "Add Module(s) successfully completed" << endl;

                if ( DataRedundancyConfig == "y" && moduleType == "pm" )
                {

                    {
                        //send messages to update fstab to new modules, if needed
                        DeviceNetworkList::iterator pt2 = devicenetworklist.begin();
                        storageDeviceList::iterator pt3 = storagedevicelist.begin();

                        for ( ; pt2 != devicenetworklist.end() ; pt2++, pt3++)
                        {
                            HostConfigList::iterator hostConfigIter = (*pt2).hostConfigList.begin();
                            string moduleName = (*pt2).DeviceName;
                            int brickID = 1;

                            if ( DataRedundancyStorageType == 2 )
                            {
                                string devices = *pt3;
                                boost::char_separator<char> sep(" ");
                                boost::tokenizer< boost::char_separator<char> > tokens(devices, sep);

                                for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                                        it != tokens.end();
                                        ++it)
                                {
                                    string deviceName = *it;
                                    string entry = deviceName + " " + installDir + "/gluster/brick" + oam.itoa(brickID)  + " " + deviceType + " defaults 1 2";
                                    //send update pm
                                    oam.distributeFstabUpdates(entry, moduleName);
                                }
                            }

                            string command = installDir + "/bin/remote_command.sh " + (*hostConfigIter).IPAddr + " " + password + " 'mkdir -p " + installDir + "/gluster/brick" + oam.itoa(brickID) + "'";
                            system(command.c_str());
                            brickID++;
                        }
                    }

                    //enable modules
                    try
                    {
                        cout << endl << "Enabling Modules " << endl;
                        oam.enableModule(enabledevicenetworklist);
                        cout << "Successful Enable of Modules " << endl;
                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** enableModule Failed :  " << e.what() << endl;
                        break;
                    }

                    cout << endl << "Adding DBRoots" << endl;

                    //add dbroots
                    string firstDBroot;

                    try
                    {
                        oam.addDbroot(dbrootNumber, dbrootlist);

                        cout << "New DBRoot IDs added = ";
                        DBRootConfigList::iterator pt1 = dbrootlist.begin();
                        firstDBroot = oam.itoa(*pt1);

                        for ( ; pt1 != dbrootlist.end() ;)
                        {
                            cout << oam.itoa(*pt1);
                            pt1++;

                            if (pt1 != dbrootlist.end())
                                cout << ", ";
                        }

                        cout << endl;

                    }
                    catch (exception& e)
                    {
                        cout << endl << "**** addDbroot Failed: " << e.what() << endl;
                        break;
                    }

                    cout << endl << "Assigning DBRoots" << endl << endl;

                    DeviceNetworkList::iterator pt = devicenetworklist.begin();
                    DBRootConfigList::iterator pt1 = dbrootlist.begin();

                    for ( ; pt != devicenetworklist.end() ; pt++)
                    {
                        string moduleName = (*pt).DeviceName;

                        DBRootConfigList dbrootlist;

                        for ( int dbrootNum = 0; dbrootNum < dbrootPerPM ; dbrootNum++)
                        {
                            dbrootlist.push_back(*pt1);
                            pt1++;
                        }

                        //assign dbroots to pm
                        try
                        {
                            oam.assignDbroot(moduleName, dbrootlist);

                            cout << endl << "Successfully Assigned DBRoots " << endl;

                        }
                        catch (exception& e)
                        {
                            cout << endl << "**** Failed Assign of DBRoots: " << e.what() << endl;
                            break;
                        }
                    }

                    cout << endl << "Run Data Redundancy Setup for DBRoots" << endl;

                    try
                    {
                        int ret = oam.glusterctl(oam::GLUSTER_ADD, firstPM, firstDBroot, password);

                        if ( ret != 0 )
                        {
                            cout << endl << "**** Failed Data Redundancy Add of DBRoots, " << endl;
                            break;
                        }

                        cout << endl << "Successfully Completed Data Redundancy Add DBRoots " << endl;

                    }
                    catch (...)
                    {
                        cout << endl << "**** glusterctl GLUSTER_ADD Failed" << endl;
                        break;
                    }

                    cout << endl << "addModule Command Successfully completed: Run startSystem command to Activate newly added Performance Modules" << endl << endl;
                }
                else
                {
                    cout << "addModule Command Successfully completed: Modules are Disabled, run alterSystem-enableModule command to enable them" << endl << endl;
                }

                try
                {
                    oam.setSystemConfig("AmazonVPCNextPrivateIP", AmazonVPCNextPrivateIP);
                }
                catch (...) {}

            }
            catch (exception& e)
            {
                cout << endl << "**** addModule Failed: " << e.what() << endl;
            }
            catch (...)
            {
                cout << endl << "**** addModule Failed : Failed to Add Module" << endl;
            }

            break;
        }

        case 49: // removeModule - parameters: Module name/type, number-of-modules
        {
            string DataRedundancyConfig = "n";
            int DataRedundancyCopies;

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if (DataRedundancyConfig == "y")
            {
                try
                {
                    oam.getSystemConfig( "DataRedundancyCopies", DataRedundancyCopies);
                }
                catch (...)
                {}
            }

            if ( SingleServerInstall == "y" )
            {
                // exit out since not on single-server install
                cout << endl << "**** removeModule Failed : not support on a Single-Server type installs  " << endl;
                break;
            }

            if (arguments[1] == "")
            {
                // need atleast 1 arguments
                cout << endl << "**** removeModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( arguments[1] == parentOAMModule )
            {
                // exit out since you can't manually remove OAM Parent Module
                cout << endl << "**** removeModule Failed : can't manually remove the Active OAM Parent Module." << endl;
                break;
            }

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** removeModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            switch ( serverInstallType )
            {
                case (oam::INSTALL_COMBINE_DM_UM_PM):
                {
                    if (arguments[1].find("um") != string::npos )
                    {
                        cout << endl << "**** removeModule Failed : User Modules not supported on the Combined  Server Installation" << endl;
                        return 0;
                    }
                }
            }

            ModuleTypeConfig moduletypeconfig;
            DeviceNetworkConfig devicenetworkconfig;
            DeviceNetworkList devicenetworklist;
            bool quit = false;

            string moduleType;

            //check if module type or module name was entered
            if ( arguments[1].size() == 2 )
            {
                //Module Type was entered

                if ( arguments[3] != "y")
                {
                    cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
                    string warning = "This command does a remove a module from the MariaDB ColumnStore System";

                    // confirm request
                    if (confirmPrompt(warning))
                        break;
                }

                int moduleCount = atoi(arguments[2].c_str());

                if ( moduleCount < 1 || moduleCount > 10  )
                {
                    cout << endl << "**** removeModule Failed : Failed to Remove Module, invalid number-of-modules entered (1-10)" << endl;
                    break;
                }

                if ( DataRedundancyConfig == "y" )
                {
                    cout << endl << "**** removeModule Failed : Data Redundancy requires you to specify modules to remove in groups." << endl;
                    break;
                }

                cout << endl;

                moduleType = arguments[1];

                //store moduleNames
                try
                {
                    oam.getSystemConfig(moduleType, moduletypeconfig);
                }
                catch (...)
                {
                    cout << endl << "**** removeModule Failed : Failed to Remove Module, getSystemConfig API Failed" << endl;
                    break;
                }

                int currentModuleCount = moduletypeconfig.ModuleCount;

                if ( moduleCount > currentModuleCount )
                {
                    cout << endl << "**** removeModule Failed : Failed to Remove Module, mount count entered to larger than configured" << endl;
                    break;
                }

                if ( moduleCount == currentModuleCount )
                {
                    if ( moduleType == "pm" )
                    {
                        cout << endl << "**** removeModule Failed : Failed to Remove Module, you can't remove last Director Module" << endl;
                        break;
                    }
                }

                //get module names in-use
                typedef std::vector<string>	moduleNameList;
                moduleNameList modulenamelist;

                DeviceNetworkList::iterator pt = moduletypeconfig.ModuleNetworkList.begin();

                for ( ; pt != moduletypeconfig.ModuleNetworkList.end() ; pt++)
                {
                    HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                    if ( (*pt1).HostName != oam::UnassignedName )
                        modulenamelist.push_back((*pt).DeviceName);
                }

                moduleNameList::reverse_iterator pt1 = modulenamelist.rbegin();

                for ( int i = 0 ; i < moduleCount ; i++)
                {
                    devicenetworkconfig.DeviceName = *pt1;
                    pt1++;
                    devicenetworklist.push_back(devicenetworkconfig);
                }
            }
            else
            {
                //Module Name was entered

                if ( arguments[2] != "y")
                {
                    cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
                    string warning = "This command removes module(s) from the MariaDB ColumnStore System";

                    // confirm request
                    if (confirmPrompt(warning))
                        break;
                }

                cout << endl;

                //parse module names
                boost::char_separator<char> sep(", ");
                boost::tokenizer< boost::char_separator<char> > tokens(arguments[1], sep);

                for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                        it != tokens.end();
                        ++it)
                {
                    devicenetworkconfig.DeviceName = *it;
                    devicenetworklist.push_back(devicenetworkconfig);

                    moduleType = (*it).substr(0, MAX_MODULE_TYPE_SIZE);

                    try
                    {
                        oam.getSystemConfig(moduleType, moduletypeconfig);
                    }
                    catch (...)
                    {
                        cout << endl << "**** removeModule Failed : Failed to Remove Module, getSystemConfig API Failed" << endl;
                        quit = true;
                        break;
                    }

                    int currentModuleCount = moduletypeconfig.ModuleCount;

                    if ( moduleType == "pm" && currentModuleCount == 1)
                    {
                        cout << endl << "**** removeModule Failed : Failed to Remove Module, you can't remove last Performance Module" << endl;
                        quit = true;
                        break;
                    }

                    if ( moduleType == "um" && currentModuleCount == 1)
                    {
                        cout << endl << "**** removeModule Failed : Failed to Remove Module, you can't remove last User Module" << endl;
                        quit = true;
                        break;
                    }
                }
            }

            if ( DataRedundancyConfig == "y" && devicenetworklist.size() != (size_t)DataRedundancyCopies)
            {
                cout << endl << "**** removeModule Failed : Data Redundancy requires you to remove modules in groups equal to number of copies" << endl;
                quit = true;
            }

            if (quit)
                break;

            DeviceNetworkList::iterator pt = devicenetworklist.begin();
            DeviceNetworkList::iterator endpt = devicenetworklist.end();

            // check for module status and if any dbroots still assigned
            for ( ; pt != endpt ; pt++)
            {
                // check module status
                try
                {
                    bool degraded;
                    int opState;
                    oam.getModuleStatus((*pt).DeviceName, opState, degraded);

                    if (opState == oam::MAN_OFFLINE ||
                            opState == oam::MAN_DISABLED ||
                            opState == oam::FAILED)
                    {

                    }
                    else
                    {
                        cout << "**** removeModule Failed : " << (*pt).DeviceName << " is not MAN_OFFLINE, DISABLED, or FAILED state.";
                        quit = true;
                        cout << endl;
                        break;
                    }
                }
                catch (exception& ex)
                {}

                // check dbrootlist should be empty on non data redundancy setups and remove dbroots if dataredundancy removal check passes
                if ( moduleType == "pm" )
                {
                    // check for dbroots assigned
                    DBRootConfigList dbrootConfigList;
                    string moduleID = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);

                    try
                    {
                        oam.getPmDbrootConfig(atoi(moduleID.c_str()), dbrootConfigList);
                    }
                    catch (...)
                    {}

                    if ( !dbrootConfigList.empty() && DataRedundancyConfig == "n")
                    {
                        cout << "**** removeModule Failed : " << (*pt).DeviceName << " has dbroots still assigned. Please run movePmDbrootConfig or unassignDbrootPmConfig.";
                        quit = true;
                        cout << endl;
                        break;
                    }
                    else if (DataRedundancyConfig == "y" && !dbrootConfigList.empty())
                    {
                        bool PMlistError = true;
                        cout << "Removing DBRoot(s)" << endl;
                        DBRootConfigList::iterator dbrootListPt = dbrootConfigList.begin();

                        for ( ; dbrootListPt != dbrootConfigList.end() ; dbrootListPt++)
                        {
                            // check if ACTIVE PM has a copy of Dbroot
                            string pmList = "";

                            try
                            {
                                string errmsg;
                                int ret = oam.glusterctl(oam::GLUSTER_WHOHAS, oam.itoa(*dbrootListPt), pmList, errmsg);

                                if ( ret != 0 )
                                {
                                    cout << endl << "**** removeModule Failed : " << (*pt).DeviceName << " glusterctl error" << endl;
                                    break;
                                }
                            }
                            catch (...)
                            {
                                cout << endl << "**** removeModule Failed : " << (*pt).DeviceName << " glusterctl error" << endl;
                                break;
                            }

                            boost::char_separator<char> sep(" ");
                            boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);

                            for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
                                    it1 != tokens.end();
                                    ++it1)
                            {
                                PMlistError = true;
                                DeviceNetworkList::iterator deviceNetListStartPt = devicenetworklist.begin();
                                string pmWithThisdbrootCopy = (*it1);

                                // walk the list of PMs that have copies of this dbroot
                                // and be sure they are in the list of nodes to be removed
                                for ( ; deviceNetListStartPt != endpt ; deviceNetListStartPt++)
                                {
                                    string thisModuleID = (*deviceNetListStartPt).DeviceName.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);

                                    //cout << "pmWithThisDBRoot: " << pmWithThisdbrootCopy << " thisModuleID: " << thisModuleID << endl;
                                    if (pmWithThisdbrootCopy == thisModuleID)
                                    {
                                        PMlistError = false;
                                    }
                                }

                                if (PMlistError)
                                {
                                    cout << "**** removeModule Failed : Attempting to remove PMs: " << arguments[1] << " -- DBRoot" << oam.itoa(*dbrootListPt) << " has copies on PMs " << pmList << endl;
                                    quit = true;
                                }
                            }
                        }

                        if (!quit)
                        {
                            try
                            {
                                if (!dbrootConfigList.empty())
                                {
                                    oam.removeDbroot(dbrootConfigList);
                                }

                                cout << endl << "   Successful Removal of DBRoots " << endl << endl;
                            }
                            catch (exception& e)
                            {
                                cout << endl << "**** removeModule : Removal of DBRoots Failed: " << e.what() << endl;
                                quit = true;
                            }
                        }
                    }
                }
            }

            if (quit)
            {
                cout << endl;
                break;
            }

            try
            {
                cout << endl << "Removing Module(s) ";
                DeviceNetworkList::iterator pt = devicenetworklist.begin();

                for ( ; pt != devicenetworklist.end() ; pt++)
                {
                    cout << (*pt).DeviceName << ", ";
                }

                cout << "please wait..." << endl;

                oam.removeModule(devicenetworklist);
                cout << endl << "Remove Module successfully completed" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "Failed to Remove Module: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** removeModule Failed : Failed to Remove Module" << endl << endl;
                break;
            }

            break;
        }

        case 50: // getModuleHostNames
        {
            SystemModuleTypeConfig systemmoduletypeconfig;
            ModuleTypeConfig moduletypeconfig;
            ModuleConfig moduleconfig;
            systemmoduletypeconfig.moduletypeconfig.clear();
            string returnValue;
            string Argument;

            // get and all display Module HostNames (NIC 1)
            // No other data will be displayed, only the hostnames.
            // This feature is designed for use by other processes.
            // It was specifically installed for the sqoop import feature (version 4.5)
            // If arguments[1] == PM, display only PMs, UM, display only UMs, else all.
            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);

                for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                {
                    if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                        // end of list
                        break;

                    int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                    if ( moduleCount == 0 )
                        // skip if no modules
                        continue;

                    string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;

                    if (arguments[1] == "pm" && moduletype != "pm")
                        continue;

                    if (arguments[1] == "um" && moduletype != "um")
                        continue;

                    DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                    for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                    {
                        HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();

                        for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
                        {
                            // Only print for NIC 1
                            if ((*pt1).NicID == 1)
                            {
                                // We need the name with domain and everything.
                                if ((*pt1).HostName == "localhost")
                                {
                                    char hostName[128] = {0};
                                    gethostname(hostName, 128);
                                    cout << hostName << endl;
                                }
                                else
                                {
                                    struct hostent* hentName = gethostbyname((*pt1).HostName.c_str());

                                    if (hentName)
                                    {
                                        cout << hentName->h_name << endl;
                                    }
                                    else
                                    {
                                        cout << (*pt1).HostName.c_str() << endl;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** getModuleHostNames Failed =  " << e.what() << endl;
            }

            break;
        }

        case 51: // disableReplication
        {
            if ( SingleServerInstall == "y" )
            {
                // exit out since not on single-server install
                cout << endl << "**** disableReplication Failed : not supported on a Single-Server type installs  " << endl;
                break;
            }

            string MySQLRep;

            try
            {
                oam.getSystemConfig("MySQLRep", MySQLRep);
            }
            catch (...) {}

            if ( MySQLRep == "n" )
            {
                string warning = "MariaDB ColumnStore Replication Feature is already disable";

                // confirm request
                if (confirmPrompt(warning))
                    break;
            }

            //set flag
            try
            {
                oam.setSystemConfig("MySQLRep", "n");
                sleep(2);
            }
            catch (...) {}

            try
            {
                oam.disableMySQLRep();
                cout << endl << "   Successful Disable of MariaDB ColumnStore Replication " << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** disableRep Failed :  " << e.what() << endl;
            }

            cout << endl;

            break;
        }

        case 52: // getModuleCpuUsers
        {
            if (arguments[1] == "")
            {
                // need 1 arguments
                cout << endl << "**** getModuleCpuUsers Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            int topNumber = 5;

            if (arguments[2] != "")
            {
                topNumber = atoi(arguments[2].c_str());

                if ( topNumber < 1 || topNumber > 10 )
                {
                    cout << endl << "**** getModuleCpuUsers Failed : Invalid top Number entered" << endl;
                    break;
                }
            }

            TopProcessCpuUsers topprocesscpuusers;

            try
            {
                oam.getTopProcessCpuUsers(arguments[1], topNumber, topprocesscpuusers);

                printModuleCpuUsers(topprocesscpuusers);

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getModuleCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
                break;
            }

            break;
        }

        case 53: // getSystemCpuUsers
        {
            int topNumber = 5;

            if (arguments[1] != "")
            {
                topNumber = atoi(arguments[1].c_str());

                if ( topNumber < 1 || topNumber > 10 )
                {
                    cout << endl << "**** getSystemCpuUsers Failed : Invalid top Number entered" << endl;
                    break;
                }
            }

            cout << endl << "System Process Top CPU Users per Module" << endl << endl;

            SystemTopProcessCpuUsers systemtopprocesscpuusers;
            TopProcessCpuUsers topprocesscpuusers;

            try
            {
                oam.getTopProcessCpuUsers(topNumber, systemtopprocesscpuusers);

                for ( unsigned int i = 0 ; i < systemtopprocesscpuusers.topprocesscpuusers.size(); i++)
                {
                    printModuleCpuUsers(systemtopprocesscpuusers.topprocesscpuusers[i]);
                }

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getSystemCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
                break;
            }

            break;
        }

        case 54: // getModuleCpu
        {
            if (arguments[1] == "")
            {
                // need 1 arguments
                cout << endl << "**** getModuleCpu Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            ModuleCpu modulecpu;

            try
            {
                oam.getModuleCpuUsage(arguments[1], modulecpu);

                printModuleCpu(modulecpu);

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getModuleCpu Failed : Failed to get Module CPU Usage" << endl << endl;
                break;
            }

            break;
        }

        case 55: // getSystemCpu
        {
            cout << endl << "System CPU Usage per Module" << endl << endl;

            SystemCpu systemcpu;

            try
            {
                oam.getSystemCpuUsage(systemcpu);

                for ( unsigned int i = 0 ; i < systemcpu.modulecpu.size(); i++)
                {
                    printModuleCpu(systemcpu.modulecpu[i]);
                }

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getSystemCpu Failed : Failed to get CPU Usage" << endl << endl;
                break;
            }

            break;
        }

        case 56: // getModuleMemoryUsers
        {
            if (arguments[1] == "")
            {
                // need 1 arguments
                cout << endl << "**** getModuleMemoryUsers Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            int topNumber = 5;

            if (arguments[2] != "")
            {
                topNumber = atoi(arguments[2].c_str());

                if ( topNumber < 1 || topNumber > 10 )
                {
                    cout << endl << "**** getModuleMemoryUsers Failed : Invalid top Number entered" << endl;
                    break;
                }
            }

            TopProcessMemoryUsers topprocessmemoryusers;

            try
            {
                oam.getTopProcessMemoryUsers(arguments[1], topNumber, topprocessmemoryusers);

                printModuleMemoryUsers(topprocessmemoryusers);

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Top Memory Users: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getModuleMemoryUsers Failed : Failed to get Top Memory Users" << endl << endl;
                break;
            }

            break;
        }

        case 57: // getSystemMemoryUsers
        {
            int topNumber = 5;

            if (arguments[1] != "")
            {
                topNumber = atoi(arguments[1].c_str());

                if ( topNumber < 1 || topNumber > 10 )
                {
                    cout << endl << "**** getSystemMemoryUsers Failed : Invalid top Number entered" << endl;
                    break;
                }
            }

            cout << endl << "System Process Top Memory Users per Module" << endl << endl;

            SystemTopProcessMemoryUsers systemtopprocessmemoryusers;
            TopProcessMemoryUsers topprocessmemoryusers;

            try
            {
                oam.getTopProcessMemoryUsers(topNumber, systemtopprocessmemoryusers);

                for ( unsigned int i = 0 ; i < systemtopprocessmemoryusers.topprocessmemoryusers.size(); i++)
                {
                    printModuleMemoryUsers(systemtopprocessmemoryusers.topprocessmemoryusers[i]);
                }

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getSystemMemoryUsers Failed : Failed to get Top CPU Users" << endl << endl;
                break;
            }

            break;
        }

        case 58: // getModuleMemory
        {
            if (arguments[1] == "")
            {
                // need 1 arguments
                cout << endl << "**** getModuleMemory Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            ModuleMemory modulememory;

            try
            {
                oam.getModuleMemoryUsage(arguments[1], modulememory);

                cout << endl << "Module Memory Usage (in K bytes)" << endl << endl;

                cout.setf(ios::left);
                cout.width(8);
                cout << "Module";
                cout.width(11);
                cout << "Mem Total";
                cout.width(9);
                cout << "Mem Used";
                cout.width(9);
                cout << "cache";
                cout.width(12);
                cout << "Mem Usage %";
                cout.width(11);
                cout << "Swap Total";
                cout.width(10);
                cout << "Swap Used";
                cout.width(13);
                cout << "Swap Usage %";
                cout << endl;

                cout.setf(ios::left);
                cout.width(8);
                cout << "------";
                cout.width(11);
                cout << "---------";
                cout.width(9);
                cout << "-------";
                cout.width(9);
                cout << "-------";
                cout.width(12);
                cout << "----------";
                cout.width(11);
                cout << "----------";
                cout.width(10);
                cout << "---------";
                cout.width(13);
                cout << "-----------";
                cout << endl;

                printModuleMemory(modulememory);
            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getModuleMemory Failed : Failed to get Module Memory Usage" << endl << endl;
                break;
            }

            break;
        }

        case 59: // getSystemMemory
        {
            cout << endl << "System Memory Usage per Module (in K bytes)" << endl << endl;

            cout.setf(ios::left);
            cout.width(8);
            cout << "Module";
            cout.width(11);
            cout << "Mem Total";
            cout.width(10);
            cout << "Mem Used";
            cout.width(9);
            cout << "Cache";
            cout.width(13);
            cout << "Mem Usage %";
            cout.width(12);
            cout << "Swap Total";
            cout.width(11);
            cout << "Swap Used";
            cout.width(14);
            cout << "Swap Usage %";
            cout << endl;

            cout.setf(ios::left);
            cout.width(8);
            cout << "------";
            cout.width(11);
            cout << "---------";
            cout.width(10);
            cout << "--------";
            cout.width(9);
            cout << "-------";
            cout.width(13);
            cout << "-----------";
            cout.width(12);
            cout << "----------";
            cout.width(11);
            cout << "---------";
            cout.width(14);
            cout << "------------";
            cout << endl;

            SystemMemory systemmemory;

            try
            {
                oam.getSystemMemoryUsage(systemmemory);

                for ( unsigned int i = 0 ; i < systemmemory.modulememory.size(); i++)
                {
                    printModuleMemory(systemmemory.modulememory[i]);
                }

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getSystemCpu Failed : Failed to get Memory Usage" << endl << endl;
                break;
            }

            break;
        }

        case 60: // getModuleDisk
        {
            if (arguments[1] == "")
            {
                // need 1 arguments
                cout << endl << "**** getModuleDisk Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            ModuleDisk moduledisk;

            try
            {
                oam.getModuleDiskUsage(arguments[1], moduledisk);

                printModuleDisk(moduledisk);

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Disk Usage: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getModuleDisk Failed : Failed to get Module Disk Usage" << endl << endl;
                break;
            }

            break;
        }

        case 61: // getSystemDisk
        {
            cout << endl << "System Disk Usage per Module" << endl << endl;

            SystemDisk systemdisk;

            try
            {
                oam.getSystemDiskUsage(systemdisk);

                for ( unsigned int i = 0 ; i < systemdisk.moduledisk.size(); i++)
                {
                    printModuleDisk(systemdisk.moduledisk[i]);
                }

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getSystemCpu Failed : Failed to get Memory Usage" << endl << endl;
                break;
            }

            break;
        }

        case 62: // getModuleResources
        {
            if (arguments[1] == "")
            {
                // need 1 arguments
                cout << endl << "**** getModuleResources Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            int topNumber = 5;

            TopProcessCpuUsers topprocesscpuusers;

            try
            {
                oam.getTopProcessCpuUsers(arguments[1], topNumber, topprocesscpuusers);
            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** getModuleCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
                break;
            }

            ModuleCpu modulecpu;

            try
            {
                oam.getModuleCpuUsage(arguments[1], modulecpu);
            }
            catch (exception& e)
            {
                cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** getModuleCpu Failed : Failed to get Module CPU Usage" << endl << endl;
                break;
            }

            TopProcessMemoryUsers topprocessmemoryusers;

            try
            {
                oam.getTopProcessMemoryUsers(arguments[1], topNumber, topprocessmemoryusers);
            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Top Memory Users: " << e.what() << endl << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** getModuleMemoryUsers Failed : Failed to get Top Memory Users" << endl << endl;
                break;
            }

            ModuleMemory modulememory;

            try
            {
                oam.getModuleMemoryUsage(arguments[1], modulememory);
            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** getModuleMemory Failed : Failed to get Module Memory Usage" << endl << endl;
                break;
            }

            ModuleDisk moduledisk;

            try
            {
                oam.getModuleDiskUsage(arguments[1], moduledisk);
            }
            catch (exception& e)
            {
                cout << endl << "Failed to get Disk Usage: " << e.what() << endl << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** getModuleDisk Failed : Failed to get Module Disk Usage" << endl << endl;
                break;
            }

            printModuleResources(topprocesscpuusers, modulecpu, topprocessmemoryusers, modulememory, moduledisk);

            break;
        }

        case 63: // getSystemResources
        {
            cout << endl << "System Resource Usage per Module" << endl << endl;

            int topNumber = 5;

            SystemModuleTypeConfig systemmoduletypeconfig;
            ModuleTypeConfig moduletypeconfig;

            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);

                for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                {
                    if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                        // end of list
                        continue;

                    int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

                    if ( moduleCount == 0 )
                        continue;

                    DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                    for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                    {
                        string modulename = (*pt).DeviceName;

                        if ( modulename == "unknown" )
                            continue;

                        TopProcessCpuUsers topprocesscpuusers;

                        try
                        {
                            oam.getTopProcessCpuUsers(modulename, topNumber, topprocesscpuusers);
                        }
                        catch (exception& e)
                        {
                            cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
                            break;
                        }
                        catch (...)
                        {
                            cout << endl << "**** getModuleCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
                            break;
                        }

                        ModuleCpu modulecpu;

                        try
                        {
                            oam.getModuleCpuUsage(modulename, modulecpu);
                        }
                        catch (exception& e)
                        {
                            cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
                            break;
                        }
                        catch (...)
                        {
                            cout << endl << "**** getModuleCpu Failed : Failed to get Module CPU Usage" << endl << endl;
                            break;
                        }

                        TopProcessMemoryUsers topprocessmemoryusers;

                        try
                        {
                            oam.getTopProcessMemoryUsers(modulename, topNumber, topprocessmemoryusers);
                        }
                        catch (exception& e)
                        {
                            cout << endl << "Failed to get Top Memory Users: " << e.what() << endl << endl;
                            break;
                        }
                        catch (...)
                        {
                            cout << endl << "**** getModuleMemoryUsers Failed : Failed to get Top Memory Users" << endl << endl;
                            break;
                        }

                        ModuleMemory modulememory;

                        try
                        {
                            oam.getModuleMemoryUsage(modulename, modulememory);
                        }
                        catch (exception& e)
                        {
                            cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
                            break;
                        }
                        catch (...)
                        {
                            cout << endl << "**** getModuleMemory Failed : Failed to get Module Memory Usage" << endl << endl;
                            break;
                        }

                        ModuleDisk moduledisk;

                        try
                        {
                            oam.getModuleDiskUsage(modulename, moduledisk);
                        }
                        catch (exception& e)
                        {
                            cout << endl << "Failed to get Disk Usage: " << e.what() << endl << endl;
                            break;
                        }
                        catch (...)
                        {
                            cout << endl << "**** getModuleDisk Failed : Failed to get Module Disk Usage" << endl << endl;
                            break;
                        }

                        printModuleResources(topprocesscpuusers, modulecpu, topprocessmemoryusers, modulememory, moduledisk);
                    }
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** getSystemResources Failed :  " << e.what() << endl;
            }

            break;
        }

        case 64: // getActiveSQLStatements
        {
            cout << endl << "Get List of Active SQL Statements" << endl;
            cout <<         "=================================" << endl << endl;

            ActiveSqlStatements activesqlstatements;

            try
            {
                oam.getActiveSQLStatements(activesqlstatements);

                if ( activesqlstatements.size() == 0 )
                {
                    cout << "No Active SQL Statements at this time" << endl << endl;
                    break;
                }

                cout << "Start Time        Time (hh:mm:ss)   Session ID             SQL Statement" << endl;
                cout << "----------------  ----------------  --------------------   ------------------------------------------------------------" << endl;

                for ( unsigned int i = 0 ; i < activesqlstatements.size(); i++)
                {
                    struct tm tmStartTime;
                    char timeBuf[36];
                    time_t startTime = activesqlstatements[i].starttime;
                    localtime_r(&startTime, &tmStartTime);
                    (void)strftime(timeBuf, 36, "%b %d %H:%M:%S", &tmStartTime);

                    cout.setf(ios::left);
                    cout.width(21);
                    cout << timeBuf;

                    //get current time in Epoch
                    time_t cal;
                    time (&cal);

                    int runTime = cal - activesqlstatements[i].starttime;
                    int runHours = runTime / 3600;
                    int runMinutes = (runTime - (runHours * 3600)) / 60;
                    int runSeconds = runTime - (runHours * 3600)  - (runMinutes * 60);

                    cout.width(15);
                    string hours = oam.itoa(runHours);
                    string minutes = oam.itoa(runMinutes);
                    string seconds = oam.itoa(runSeconds);

                    string run;

                    if ( hours.size() == 1 )
                        run = "0" + hours + ":";
                    else
                        run = hours + ":";

                    if ( minutes.size() == 1 )
                        run = run + "0" + minutes + ":";
                    else
                        run = run + minutes + ":";

                    if ( seconds.size() == 1 )
                        run = run + "0" + seconds;
                    else
                        run = run + seconds;

                    cout << run;

                    cout.width(23);
                    cout << activesqlstatements[i].sessionid;

                    string SQLStatement = activesqlstatements[i].sqlstatement;
                    int pos = 0;

                    for ( ;; )
                    {
                        string printSQL = SQLStatement.substr(pos, 60);
                        pos = pos + 60;
                        cout << printSQL << endl;

                        if ( printSQL.size() < 60 )
                            break;

                        cout.width(59);
                        cout << " ";
                    }

                    cout << endl;
                }

            }
            catch (exception& e)
            {
                cout << endl << "Failed to get List of Active SQL Statements: " << e.what() << endl << endl;
            }
            catch (...)
            {
                cout << endl << "**** getActiveSQLStatements Failed : Failed to get List of Active SQL Statements" << endl << endl;
                break;
            }

            break;
        }

        case 65: // alterSystem-disableModule
        {

            string DataRedundancyConfig = "n";

            try
            {
                oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
            }
            catch (...)
            {}

            if ( SingleServerInstall == "y" )
            {
                // exit out since not on single-server install
                cout << endl << "**** alterSystem-disableModule Failed : not support on a Single-Server type installs  " << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                //exit out since not on Parent OAM Module
                cout << endl << "**** alterSystem-disableModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[1] == "")
            {
                // need arguments
                cout << endl << "**** alterSystem-disableModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( arguments[1] == parentOAMModule )
            {
                // exit out since you can't manually remove OAM Parent Module
                cout << endl << "**** alterSystem-disableModule Failed : can't manually disable the Active OAM Parent Module." << endl;
                break;
            }

            string moduleType = arguments[1].substr(0, MAX_MODULE_TYPE_SIZE);

            gracefulTemp = INSTALL;

            //display Primary UM Module
            string PrimaryUMModuleName;

            try
            {
                oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
            }
            catch (...) {}

            bool primUM = false;

            if ( PrimaryUMModuleName == arguments[1] )
            {
                cout << endl << "This command stops the processing of applications on the Primary User Module, which is where DDL/DML are performed";

                if (confirmPrompt("If there is another module that can be changed to a new Primary User Module, this will be done"))
                    break;

                primUM = true;
            }
            else
            {
                // confirm request
                if ( arguments[2] != "y" )
                {
                    if (confirmPrompt("This command stops the processing of applications on a Module within the MariaDB ColumnStore System"))
                        break;
                }
            }

            //parse module names
            DeviceNetworkConfig devicenetworkconfig;
            DeviceNetworkList devicenetworklist;

            boost::char_separator<char> sep(", ");
            boost::tokenizer< boost::char_separator<char> > tokens(arguments[1], sep);

            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                    it != tokens.end();
                    ++it)
            {
                devicenetworkconfig.DeviceName = *it;
                devicenetworklist.push_back(devicenetworkconfig);
            }

            DeviceNetworkList::iterator pt = devicenetworklist.begin();
            DeviceNetworkList::iterator endpt = devicenetworklist.end();

            bool quit = false;

            // check for module status and if any dbroots still assigned
            if ( moduleType == "pm" )
            {
                for ( ; pt != endpt ; pt++)
                {
                    // check for dbroots assigned
                    DBRootConfigList dbrootConfigList;
                    string moduleID = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);

                    try
                    {
                        oam.getPmDbrootConfig(atoi(moduleID.c_str()), dbrootConfigList);
                    }
                    catch (...)
                    {}

                    if ( !dbrootConfigList.empty() && DataRedundancyConfig == "n")
                    {
                        cout << endl << "**** alterSystem-disableModule Failed : " << (*pt).DeviceName << " has dbroots still assigned and will not be disabled. Please run movePmDbrootConfig or unassignDbrootPmConfig.";
                        quit = true;
                        cout << endl;
                        break;
                    }
                    else if (!dbrootConfigList.empty() && DataRedundancyConfig == "y")
                    {
                        //check if dbroot requested to be removed is empty and dboot #1 is requested to be removed
                        DBRootConfigList::iterator pt = dbrootConfigList.begin();

                        for ( ; pt != dbrootConfigList.end() ; pt++)
                        {
                            int dbrootID = *pt;

                            //check if dbroot is empty
                            bool isEmpty = false;
                            string errMsg;

                            try
                            {
                                BRM::DBRM dbrm;

                                if ( dbrm.isDBRootEmpty(dbrootID, isEmpty, errMsg) != 0)
                                {
                                    cout << endl << "**** alterSystem-disableModule Failed : Data Redundancy detected DBRoots must be empty to be disabled. Remove data from DBRoot #" << oam.itoa(dbrootID) << " to continue." << endl;
                                    cout << "ERROR: isDBRootEmpty API error, dbroot #" << oam.itoa(dbrootID) << " :" << errMsg << endl;
                                    quit = true;
                                }
                            }
                            catch (...)
                            {}
                        }
                    }
                }

                if (quit)
                {
                    cout << endl;
                    break;
                }
            }

            if ( devicenetworklist.empty() )
            {
                cout << endl << "quiting, no modules to remove." << endl << endl;
                break;
            }

            // stop module
            try
            {
                cout << endl << "   Stopping Modules" << endl;
                oam.stopModule(devicenetworklist, gracefulTemp, ackTemp);
                cout << "   Successful stop of Modules " << endl;
            }
            catch (exception& e)
            {

                string Failed = e.what();

                if (Failed.find("Disabled") != string::npos)
                    cout << endl << "   Successful stop of Modules " << endl;
                else
                {
                    cout << endl << "**** stopModule Failed :  " << e.what() << endl;
                    break;
                }
            }

            // disable module
            try
            {
                cout << endl << "   Disabling Modules" << endl;
                oam.disableModule(devicenetworklist);
                cout << "   Successful disable of Modules " << endl;

                //display Primary UM Module
                string PrimaryUMModuleName;

                try
                {
                    oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
                }
                catch (...) {}

                if ( primUM &&
                        PrimaryUMModuleName != arguments[1] )
                    cout << endl << "   New Primary User Module = " << PrimaryUMModuleName << endl;

            }
            catch (exception& e)
            {
                cout << endl << "**** disableModule Failed :  " << e.what() << endl;
                break;
            }

            cout << endl;
            break;
        }

        case 66: // alterSystem-enableModule
        {
            if ( SingleServerInstall == "y" )
            {
                // exit out since not on single-server install
                cout << endl << "**** alterSystem-enableModule Failed : not support on a Single-Server type installs  " << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                //exit out since not on Parent OAM Module
                cout << endl << "**** alterSystem-enableModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[1] == "")
            {
                // need arguments
                cout << endl << "**** alterSystem-enableModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
                break;
            }

            string moduleType = arguments[1].substr(0, MAX_MODULE_TYPE_SIZE);

            ACK_FLAG ackTemp = ACK_YES;

            // confirm request
            if ( arguments[2] != "y" )
            {
                if (confirmPrompt("This command starts the processing of applications on a Module within the MariaDB ColumnStore System"))
                    break;
            }

            //parse module names
            DeviceNetworkConfig devicenetworkconfig;
            DeviceNetworkList devicenetworklist;
            boost::char_separator<char> sep(", ");
            boost::tokenizer< boost::char_separator<char> > tokens(arguments[1], sep);

            for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
                    it != tokens.end();
                    ++it)
            {
                devicenetworkconfig.DeviceName = *it;
                devicenetworklist.push_back(devicenetworkconfig);
            }

            //get the system status, enable modules and startmodules if system is ACTIVE
            SystemStatus systemstatus;

            try
            {
                oam.getSystemStatus(systemstatus);

                // enable module
                try
                {
                    cout << endl << "   Enabling Modules " << endl;
                    oam.enableModule(devicenetworklist);
                    cout << "   Successful enable of Modules " << endl;
                }
                catch (exception& e)
                {
                    cout << endl << "**** enableModule Failed :  " << e.what() << endl;
                    break;
                }

                if ( moduleType == "pm" )
                {
                    cout << endl << "   Performance Module(s) Enabled, run movePmDbrootConfig or assignDbrootPmConfig to assign dbroots, if needed" << endl << endl;
                    break;
                }
                else
                {
                    if (systemstatus.SystemOpState == oam::ACTIVE )
                    {
						try
						{
							cout << endl << "   Restarting System " << endl;
							gracefulTemp = oam::FORCEFUL;
							int returnStatus = oam.restartSystem(gracefulTemp, ackTemp);
							switch (returnStatus)
							{ 
								case API_SUCCESS:
									if ( waitForActive() )
										cout << endl << "   Successful restart of System " << endl << endl;
									else
										cout << endl << "**** restartSystem Failed : check log files" << endl;
									break;
								case API_CANCELLED:
									cout << endl << "   Restart of System canceled" << endl << endl;
									break;
								default:
									cout << endl << "**** restartSystem Failed : Check system logs" << endl;
									break;
							}
						}
						catch (exception& e)
						{
							cout << endl << "**** restartSystem Failed :  " << e.what() << endl;
							break;
						}
                    }
                    else
                        cout << endl << "   System not Active, run 'startSystem' to start system if needed" << endl;
                }
            }
            catch (exception& e)
            {
                cout << endl << "**** alterSystem-enableModule Failed : " << e.what() << endl;
                break;
            }
            catch (...)
            {
                cout << endl << "**** alterSystem-enableModule Failed,  Failed return from getSystemStatus API" << endl;
                break;
            }

            cout << endl;

            break;
        }

        case 67: // AVAILABLE
        {
        }


        default:
        {
            cout << arguments[0] << ": Unknown Command, type help for list of commands" << endl << endl;
            return 1;
        }
    }

    return 0;
}

/******************************************************************************************
 * @brief	ProcessSupportCommand
 *
 * purpose:	Process Support commands
 *
 ******************************************************************************************/
int ProcessSupportCommand(int CommandID, std::string arguments[])
{
    Oam oam;
    GRACEFUL_FLAG gracefulTemp = GRACEFUL;
    ACK_FLAG ackTemp = ACK_YES;
    CC_SUSPEND_ANSWER suspendAnswer = WAIT;
    bool bNeedsConfirm = true;
    string cmd;

    switch ( CommandID )
    {
        case 0: // helpsupport
        {
            // display commands in the Support Command list
            cout << endl << "List of Support commands" << endl << endl;

            for (int i = 1;; i++)
            {
                if (supportCmds[i] == "")
                    // end of list
                    break;

                cout << "   " << supportCmds[i] << endl;
            }

            cout << endl;
        }
        break;

        case 1: // stopprocess - parameters: Process-name, Module-name, Graceful flag, Ack flag
        {
            if (arguments[2] == "")
            {
                // need arguments
                cout << endl << "**** stopprocess Failed : Missing a required Parameter, Enter Process and Module names" << endl;
                break;
            }

            // don't allow stopping of Process-Monitor
            if ( arguments[1] == "ProcessMonitor" )
            {
                cout << "ProcessMonitor is controlled by 'init' and can not be stopped" << endl;
                break;
            }
            else
            {
                // give warning for Process-Monitor
                if ( arguments[1] == "ProcessManager" )
                {
                    if (confirmPrompt("ProcessManager is the Interface for the Console and should only be removed as part of a MariaDB ColumnStore Package installation"))
                        break;
                }
                else
                {
                    if ( arguments[3] != "y" )
                    {
                        getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

                        // confirm request
                        if (confirmPrompt("This command stops the processing of an application on a Module within the MariaDB ColumnStore System"))
                            break;
                    }
                }
            }

            try
            {
                oam.stopProcess(arguments[2], arguments[1], gracefulTemp, ackTemp);
                cout << endl << "   Successful stop of Process " << arguments[1] << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** stopprocess Failed :  " << e.what() << endl;
            }
        }
        break;

        case 2: // startprocess - parameters: Process-name, Module-name, Graceful flag, Ack flag
        {
            if (arguments[2] == "")
            {
                // need arguments
                cout << endl << "**** startprocess Failed : Missing a required Parameter, Enter Process and Module names" << endl;
                break;
            }

            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

            try
            {
                oam.startProcess(arguments[2], arguments[1], gracefulTemp, ackTemp);
                cout << endl << "   Successful start of Process " << arguments[1] << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** startprocess Failed :  " << e.what() << endl;
            }
        }
        break;

        case 3: // restartprocess - parameters: Process-name, Module-name, Graceful flag, Ack flag
        {
            if (arguments[2] == "")
            {
                // need arguments
                cout << endl << "**** restartprocess Failed : Missing a required Parameter, Enter Process and Module names" << endl;
                break;
            }

            getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);

            if (arguments[3] != "y")
            {
                // confirm request
                if (confirmPrompt("This command restarts the processing of an application on a Module within the MariaDB ColumnStore System"))
                    break;
            }


            try
            {
                oam.restartProcess(arguments[2], arguments[1], gracefulTemp, ackTemp);
                cout << endl << "   Successful restart of Process " << arguments[1] << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** restartprocess Failed :  " << e.what() << endl;
            }
        }
        break;

        case 4: // killpid
        {
            if (arguments[1] == "" || arguments[2] != "")
            {
                // need arguments
                cout << endl << "**** killpid Failed : Invalid or Missing Parameter, Enter local Process-ID" << endl;
                break;
            }

            pid_t PID = atoi(arguments[1].c_str());

            if ( PID <= 0 )
            {
                cout << endl << "**** killpid Failed : Invalid Process-ID Entered" << endl;
                break;
            }

            int status = kill( PID, SIGTERM);

            if ( status != API_SUCCESS)
                cout << endl << "   Failure in kill of Process-ID " << arguments[1] << ", Failed: " << errno << endl << endl;
            else
                cout << endl << "   Successful kill of Process-ID " << arguments[1] << endl << endl;
        }
        break;

        case 5: // rebootsystem - parameters: password
        {
            if ( !rootUser)
            {
                cout << endl << "**** rebootsystem Failed : command not available when running as non-root user" << endl;
                break;
            }

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** rebootsystem Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            if (arguments[1] == "" || arguments[1] == "y")
            {
                // need arguments
                cout << endl << "**** rebootsystem Failed : Invalid or Missing Parameter, Provide root-password" << endl;
                break;
            }

            string password = arguments[1];

            if ( arguments[2] != "y")
            {
                cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
                string warning = "This command stops the Processing of applications and reboots all modules within the MariaDB ColumnStore System";

                // confirm request
                if (confirmPrompt(warning))
                    break;
            }

            cout << endl << "   Stop System being performed, please wait..." << endl;

            try
            {
                cout << endl << "   System being stopped, please wait... " << endl;
                oam.stopSystem(GRACEFUL, ACK_YES);

                if ( waitForStop() )
                    cout << endl << "   Successful stop of System " << endl << endl;
                else
                    cout << endl << "**** stopSystem Failed : check log files" << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** stopSystem Failed :  " << e.what() << endl;
                string warning = "stopSystem command failed,";

                // confirm request
                if (confirmPrompt(warning))
                    break;
            }

            SystemModuleTypeConfig systemmoduletypeconfig;
            systemmoduletypeconfig.moduletypeconfig.clear();

            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);

                bool FAILED = false;

                for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                {
                    if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                        // end of list
                        break;

                    int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
                    string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;

                    if ( moduleCount > 0 )
                    {
                        DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                        {
                            string modulename = (*pt).DeviceName;

                            if (modulename == parentOAMModule )
                            {
                                //do me last
                                continue;
                            }

                            //skip modules in MAN_DISABLED state
                            try
                            {
                                int opState;
                                bool degraded;
                                oam.getModuleStatus(modulename, opState, degraded);

                                if (opState == oam::MAN_DISABLED )
                                    //skip
                                    continue;
                            }
                            catch (exception& ex)
                            {}

                            //run remote command script
                            HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
                            cmd = installDir + "/bin/remote_command.sh " + (*pt1).IPAddr + " " + password + " reboot " ;
                            int rtnCode = system(cmd.c_str());

                            if (WEXITSTATUS(rtnCode) != 0)
                            {
                                cout << "Failed with running remote_command.sh" << endl;
                                FAILED = true;
                            }
                            else
                                cout << endl << "   Successful reboot request of Module " << modulename << endl;
                        }
                    }
                }

                if ( FAILED )
                    break;

                //reboot local module
                int rtnCode = system("reboot");

                if (WEXITSTATUS(rtnCode) != 0)
                    cout << "Failed rebooting local module" << endl;
                else
                {
                    cout << endl << "   Successful reboot request of local Module" << endl;
                    // close the log file
                    writeLog("End of a command session!!!");
                    logFile.close();
                    cout << endl << "Exiting the MariaDB ColumnStore Command Console" << endl;
                    exit (0);
                }
            }
            catch (...)
            {
                cout << endl << "**** rebootsystem Failed : Failed on getSystemConfig API" << endl;
                break;
            }
        }
        break;

        case 6: // rebootnode - parameters: module-name password
        {
            if ( !rootUser)
            {
                cout << endl << "**** rebootnode Failed : command not available when running as non-root user" << endl;
                break;
            }

            if (arguments[1] == "" || arguments[2] == "")
            {
                // need arguments
                cout << endl << "**** rebootnode Failed : Invalid or Missing Parameter, Enter module-name and root-password" << endl;
                break;
            }

            string inputModuleName = arguments[1];
            string password = arguments[2];

            if ( arguments[3] != "y")
            {
                cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
                string warning = "This command reboots a node within the MariaDB ColumnStore System";

                // confirm request
                if (confirmPrompt(warning))
                    break;
            }

            SystemModuleTypeConfig systemmoduletypeconfig;
            systemmoduletypeconfig.moduletypeconfig.clear();

            try
            {
                oam.getSystemConfig(systemmoduletypeconfig);
                unsigned int i = 0;

                for (  ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
                {
                    if ( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
                    {
                        // end of list
                        break;
                    }

                    int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
                    string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;

                    if ( moduleCount > 0 )
                    {
                        DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

                        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
                        {
                            string modulename = (*pt).DeviceName;

                            if (inputModuleName == modulename )
                            {
                                if (inputModuleName == localModule )
                                {
                                    //reboot local module
                                    int rtnCode = system("reboot");

                                    if (WEXITSTATUS(rtnCode) != 0)
                                        cout << "Failed rebooting local node" << endl;
                                    else
                                    {
                                        cout << endl << "   Successful reboot request of Node " << modulename << endl;
                                        // close the log file
                                        writeLog("End of a command session!!!");
                                        logFile.close();
                                        cout << endl << "Exiting the MariaDB ColumnStore Command Console" << endl;
                                        exit (0);
                                    }
                                }
                                else
                                {
                                    HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
                                    string ipAddr = (*pt1).IPAddr;
                                    //run remote command script
                                    cmd = installDir + "/bin/remote_command.sh " + ipAddr + " " + password + " reboot " ;
                                    int rtnCode = system(cmd.c_str());

                                    if (WEXITSTATUS(rtnCode) != 0)
                                        cout << "Failed with running remote_command.sh" << endl;
                                    else
                                        cout << endl << "   Successful reboot request of Node " << modulename << endl;

                                    return (0);
                                }
                            }
                        }
                    }
                }
            }
            catch (...)
            {
                cout << endl << "**** rebootnode Failed : Failed on getSystemConfig API" << endl;
                break;
            }
        }
        break;

        case 7: // stopdbrmprocess
        {
            if ( arguments[1] != "y" )
            {
                // confirm request
                if (confirmPrompt("This command stops the dbrm processes within the MariaDB ColumnStore System"))
                    break;
            }

            try
            {
                oam.stopProcessType("DBRM");
                cout << endl << "   Successful stop of DBRM Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** stopdbrmprocess Failed :  " << e.what() << endl;
            }
        }
        break;

        case 8: // startdbrmprocess
        {
            try
            {
                oam.startProcessType("DBRM");
                cout << endl << "   Successful Start of DBRM Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** startdbrmprocess Failed :  " << e.what() << endl;
            }
        }
        break;

        case 9: // restartdbrmprocess
        {
            if ( arguments[1] != "y" )
            {
                // confirm request
                if (confirmPrompt("This command restarts the dbrm processes within the MariaDB ColumnStore System"))
                    break;
            }

            try
            {
                oam.restartProcessType("DBRM");
                cout << endl << "   Successful Restart of DBRM Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** restartdbrmprocess Failed :  " << e.what() << endl;
            }
        }
        break;

        case 10: // setsystemstartupstate
        {
            Config* sysConfig = Config::makeConfig();

            parentOAMModule = getParentOAMModule();

            if ( localModule != parentOAMModule )
            {
                // exit out since not on Parent OAM Module
                cout << endl << "**** setsystemstartupstate Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
                break;
            }

            string systemStartupOffline;

            try
            {
                systemStartupOffline = sysConfig->getConfig("Installation", "SystemStartupOffline");
                cout << "SystemStartupOffline currently set to '" + systemStartupOffline + "'" << endl;
            }
            catch (...)
            {
                cout << "ERROR: Problem getting systemStartupOffline from the MariaDB ColumnStore System Configuration file" << endl;
                return 1;
            }

            while (true)
            {
                char* pcommand = 0;
                string prompt;
                string temp = "cancel";
                prompt = "Set system startup state to offline: (y,n,cancel) [cancel]: ";
                pcommand = readline(prompt.c_str());

                if (pcommand)
                {
                    if (strlen(pcommand) > 0) temp = pcommand;

                    free(pcommand);
                    pcommand = 0;
                }

                if ( temp == "cancel" )
                    return 0;

                if ( temp == "n" || temp == "y")
                {
                    systemStartupOffline = temp;
                    break;
                }

                cout << "Invalid Option, please re-enter" << endl;
            }

            try
            {
                sysConfig->setConfig("Installation", "SystemStartupOffline", systemStartupOffline);
                sysConfig->write();
            }
            catch (...)
            {
                cout << "ERROR: Problem setting systemStartupOffline in the MariaDB ColumnStore System Configuration file" << endl;
                exit(-1);
            }

            cout << endl << "   Successful setting of systemStartupOffline to '" << systemStartupOffline << "'" << endl << endl;
        }
        break;

        case 11: // stopPrimProcs
        {
            if ( arguments[1] != "y" )
            {
                // confirm request
                if (confirmPrompt("This command stops the PrimProc processes within the MariaDB ColumnStore System"))
                    break;
            }

            try
            {
                oam.stopProcessType("PrimProc");
                cout << endl << "   Successful stop of PrimProc Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** stopPrimProcs Failed :  " << e.what() << endl;
            }
        }
        break;

        case 12: // startPrimProcs
        {
            try
            {
                oam.startProcessType("PrimProc");
                cout << endl << "   Successful Start of PrimProc Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** startPrimProcs Failed :  " << e.what() << endl;
            }
        }
        break;

        case 13: // restartPrimProcs
        {
            if ( arguments[1] != "y" )
            {
                // confirm request
                if (confirmPrompt("This command restarts the PrimProc processes within the MariaDB ColumnStore System"))
                    break;
            }

            try
            {
                oam.restartProcessType("PrimProc");
                cout << endl << "   Successful Restart of PrimProc Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** restartPrimProcs Failed :  " << e.what() << endl;
            }
        }
        break;

        case 14: // stopExeMgrs
        {
            if ( arguments[1] != "y" )
            {
                // confirm request
                if (confirmPrompt("This command stops the ExeMgr processes within the MariaDB ColumnStore System"))
                    break;
            }

            try
            {
                oam.stopProcessType("ExeMgr");
                cout << endl << "   Successful stop of ExeMgr Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** stopExeMgrs Failed :  " << e.what() << endl;
            }
        }
        break;

        case 15: // startExeMgrs
        {
            try
            {
                oam.startProcessType("ExeMgr");
                cout << endl << "   Successful Start of ExeMgr Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** startExeMgrs Failed :  " << e.what() << endl;
            }
        }
        break;

        case 16: // restartExeMgrs
        {
            if ( arguments[1] != "y" )
            {
                // confirm request
                if (confirmPrompt("This command restarts the ExeMgr processes within the MariaDB ColumnStore System"))
                    break;
            }

            try
            {
                oam.restartProcessType("ExeMgr");
                cout << endl << "   Successful Restart of ExeMgr Processes" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** restartExeMgrs Failed :  " << e.what() << endl;
            }
        }
        break;

        case 17: // getProcessStatusStandby - parameters: NONE
        {
            printProcessStatus("ProcStatusControlStandby");
        }
        break;

        case 18: // distributeconfigfile - parameters: option, moduleName
        {
            string name = "system";

            if ( arguments[1] != "" )
                name = arguments[1];

            try
            {
                oam.distributeConfigFile(name);
                cout << endl << "   Successful Distribution of MariaDB ColumnStore Config File" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** Distribution of MariaDB ColumnStore Config File Failed :  " << e.what() << endl;
            }
        }
        break;

        case 19: // getPmDbrootConfig - paramaters: pm id
        {
            string pmID;

            if (arguments[1] == "")
            {
                cout << endl;
                string prompt = "Enter the Performance Module ID";
                pmID = dataPrompt(prompt);
            }
            else
                pmID = arguments[1];

            try
            {
                DBRootConfigList dbrootConfigList;
                oam.getPmDbrootConfig(atoi(pmID.c_str()), dbrootConfigList);

                cout << "DBRoot IDs assigned to 'pm" + pmID + "' = ";

                DBRootConfigList::iterator pt = dbrootConfigList.begin();

                for ( ; pt != dbrootConfigList.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != dbrootConfigList.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getPmDbrootConfig Failed :  " << e.what() << endl;
            }
        }
        break;

        case 20: // getDbrootPmConfig - parameters dbroot id
        {
            string dbrootID;

            if (arguments[1] == "")
            {
                cout << endl;
                string prompt = "Enter the DBRoot ID";
                dbrootID = dataPrompt(prompt);
            }
            else
                dbrootID = arguments[1];

            try
            {
                int pmID;
                oam.getDbrootPmConfig(atoi(dbrootID.c_str()), pmID);

                cout << endl << " DBRoot ID " << dbrootID << " is assigned to 'pm" << pmID << "'" << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getDbrootPmConfig Failed :  " << e.what() << endl;
            }
        }
        break;

        case 21: // getSystemDbrootConfig
        {
            cout << endl << "System DBroot Configuration" << endl << endl;

            try
            {
                DBRootConfigList dbrootConfigList;
                oam.getSystemDbrootConfig(dbrootConfigList);

                cout << "System DBRoot IDs = ";
                DBRootConfigList::iterator pt = dbrootConfigList.begin();

                for ( ; pt != dbrootConfigList.end() ;)
                {
                    cout << oam.itoa(*pt);
                    pt++;

                    if (pt != dbrootConfigList.end())
                        cout << ", ";
                }

                cout << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** getSystemDbrootConfig Failed :  " << e.what() << endl;
            }
        }
        break;

        case 22: // checkDBFunctional
        {
            try
            {
                oam.checkDBFunctional(false);
                cout << endl << "   checkDBFunctional Successful" << endl << endl;
            }
            catch (exception& e)
            {
                cout << endl << "**** checkDBFunctional Failed :  " << e.what() << endl;
                cout << endl << "     can check UM " + tmpDir + "/dbfunctional.log for possible additional information" << endl << endl;
            }
            catch (...)
            {
                cout << endl << "   checkDBFunctional Failed: check UM " + tmpDir + "/dbfunctional.log" << endl << endl;
            }
        }
        break;

        case 23: // getsystemreadflags
        {

            cout << " Print the DB System Flags. 1 = set and ready, 0 = clear and not ready" << endl;

            BRM::DBRM dbrm;

            cout << endl;

            try
            {
                cout << "getSystemQueryReady = " << dbrm.getSystemQueryReady() << endl;
            }
            catch (...)
            {}

            try
            {
                cout << "getSystemReady = " << dbrm.getSystemReady() << endl;
            }
            catch (...)
            {}

            try
            {
                cout << "getSystemSuspended = " << dbrm.getSystemSuspended() << endl;
            }
            catch (...)
            {}
        }
        break;

        case 24: // setsystemqueryready
        {
            BRM::DBRM dbrm;

            string set = "0";

            if (arguments[1] == "")
            {
                cout << endl;
                string prompt = "Enter 1 for set and 0 for clear";
                set = dataPrompt(prompt);
            }
            else
                set = arguments[1];

            bool flag = true;

            if ( set == "0" )
                flag = false;

            cout << endl;

            try
            {
                cout << "getSystemQueryReady = " << dbrm.getSystemQueryReady() << endl;
            }
            catch (...)
            {}

            cout << endl;

            try
            {
                dbrm.setSystemQueryReady(flag);
                cout << "setSystemQueryReady = " << flag << endl;
            }
            catch (...)
            {}

            cout << endl;

            try
            {
                cout << "getSystemQueryReady = " << dbrm.getSystemQueryReady() << endl;
            }
            catch (...)
            {}
        }

        default: // shouldn't get here, but...
            return 1;

    } // end of switch

    return 0;
}

/******************************************************************************************
 * @brief	getFlags
 *
 * purpose:	get and convert Graceful and Ack flags
 *
 ******************************************************************************************/
void getFlags(const string* arguments, GRACEFUL_FLAG& gracefulTemp, ACK_FLAG& ackTemp, oam::CC_SUSPEND_ANSWER& suspendAnswer, bool& bNeedsConfirm, string* password)
{
    gracefulTemp = GRACEFUL;                      // default
    ackTemp = ACK_YES;                             // default
    suspendAnswer = CANCEL;
    bNeedsConfirm = true;

    for ( int i = 1; i < ArgNum; i++)
    {
        if (strcasecmp(arguments[i].c_str(), "Y") == 0)
            bNeedsConfirm = false;
        else if (strcasecmp(arguments[i].c_str(), "N") == 0)
            bNeedsConfirm = true;
        else if (strcasecmp(arguments[i].c_str(), "GRACEFUL") == 0)
            gracefulTemp = oam::GRACEFUL;
        else if (strcasecmp(arguments[i].c_str(), "FORCEFUL") == 0)
            gracefulTemp = FORCEFUL;
        else if (strcasecmp(arguments[i].c_str(), "INSTALL") == 0)
            gracefulTemp = INSTALL;
        else if (strcasecmp(arguments[i].c_str(), "ACK_YES") == 0 || strcasecmp(arguments[i].c_str(), "YES_ACK") == 0)
            ackTemp = ACK_YES;
        else if (strcasecmp(arguments[i].c_str(), "ACK_NO") == 0 || strcasecmp(arguments[i].c_str(), "NO_ACK") == 0)
            ackTemp = ACK_NO;
        else if (strcasecmp(arguments[i].c_str(), "WAIT") == 0)
            suspendAnswer = WAIT;
        else if (strcasecmp(arguments[i].c_str(), "ROLLBACK") == 0)
            suspendAnswer = ROLLBACK;
        else if (strcasecmp(arguments[i].c_str(), "FORCE") == 0)
            suspendAnswer = FORCE;
        else if (password && arguments[i].length() > 0)
            *password = arguments[i];
    }
}


/******************************************************************************************
 * @brief	confirmPrompt
 *
 * purpose:	Confirmation prompt
 *
 ******************************************************************************************/
int confirmPrompt(std::string warningCommand)
{
    char* pcommand = 0;
    char* p;
    string argument = "n";

    while (true)
    {
        // read input
        if (warningCommand.size() > 0)
        {
            cout << endl << warningCommand << endl;
        }

        pcommand = readline("           Do you want to proceed: (y or n) [n]: ");

        if (pcommand && *pcommand)
        {
            p = strtok(pcommand, " ");
            argument = p;
            free(pcommand);
            pcommand = 0;
        }

        if (pcommand)
        {
            free(pcommand);
            pcommand = 0;
        }

        // covert argument into lowercase
        transform (argument.begin(), argument.end(), argument.begin(), to_lower());

        if ( argument == "y")
            return 0;
        else if ( argument == "n")
            return 1;
    }
}

/******************************************************************************************
 * @brief	dataPrompt
 *
 * purpose:	Prompt for additional data
 *
 ******************************************************************************************/
std::string dataPrompt(std::string promptCommand)
{
    char data[CmdSize];
    char* pdata = data;
    char* pd;
    string argument;

    while (true)
    {
        // read input
        cout << promptCommand << endl;
        pdata = readline("           Please enter: ");

        if (!pdata)                            // user hit <Ctrl>-D
            pdata = strdup("exit");

        else if (!*pdata)
            // just an enter-key was entered, ignore and reprompt
            continue;

        pd = pdata;
        argument = pd;

        return argument;
    }
}


/******************************************************************************************
 * @brief	writeLog for command
 *
 * purpose:	write command to the log file
 *
 ******************************************************************************************/
void writeLog(string command)
{
    Oam oam;

    //filter off password on reboot commands

    logFile << oam.getCurrentTime() << ": " << command << endl;
    logFile.flush();
    return;
}

/******************************************************************************************
 * @brief	printAlarmSummary
 *
 * purpose:	get active alarms and produce a summary
 *
 ******************************************************************************************/
void printAlarmSummary()
{
    AlarmList alarmList;
    Oam oam;

    try
    {
        oam.getActiveAlarms(alarmList);
    }
    catch (...)
    {
        return;
    }

    int critical = 0, major = 0, minor = 0, warning = 0, info = 0;
    AlarmList :: iterator i;

    for (i = alarmList.begin(); i != alarmList.end(); ++i)
    {
        switch (i->second.getSeverity())
        {
            case CRITICAL:
                ++critical;
                break;

            case MAJOR:
                ++major;
                break;

            case MINOR:
                ++minor;
                break;

            case WARNING:
                ++warning;
                break;

            case INFORMATIONAL:
                ++info;
                break;
        }
    }

    cout << endl << "Active Alarm Counts: ";
    cout << "Critical = " << critical;
    cout << ", Major = " << major;
    cout << ", Minor = " << minor;
    cout << ", Warning = " << warning;
    cout << ", Info = " << info;
    cout << endl;
}

/******************************************************************************************
 * @brief	printCriticalAlarms
 *
 * purpose:	get active Critical alarms
 *
 ******************************************************************************************/
void printCriticalAlarms()
{
    AlarmList alarmList;
    Oam oam;

    try
    {
        oam.getActiveAlarms(alarmList);
    }
    catch (...)
    {
        return;
    }

    cout << endl << "Critical Active Alarms:" << endl << endl;

    AlarmList :: iterator i;

    for (i = alarmList.begin(); i != alarmList.end(); ++i)
    {
        switch (i->second.getSeverity())
        {
            case CRITICAL:
                cout << "AlarmID           = " << i->second.getAlarmID() << endl;
                cout << "Brief Description = " << i->second.getDesc() << endl;
                cout << "Alarm Severity    = ";
                cout << "CRITICAL" << endl;
                cout << "Time Issued       = " << i->second.getTimestamp() << endl;
                cout << "Reporting Module  = " << i->second.getSname() << endl;
                cout << "Reporting Process = " << i->second.getPname() << endl;
                cout << "Reported Device   = " << i->second.getComponentID() << endl << endl;
                break;

            case MAJOR:
            case MINOR:
            case WARNING:
            case INFORMATIONAL:
                break;
        }
    }
}

/******************************************************************************************
 * @brief	printSystemStatus
 *
 * purpose:	get and Display System and Module Statuses
 *
 ******************************************************************************************/
void printSystemStatus()
{
    SystemStatus systemstatus;
    Oam oam;
    BRM::DBRM dbrm(true);

    cout << endl << "System " << systemName << endl << endl;
    cout << "System and Module statuses" << endl << endl;
    cout << "Component     Status                       Last Status Change" << endl;
    cout << "------------  --------------------------   ------------------------" << endl;

    try
    {
        oam.getSystemStatus(systemstatus, false);
        cout << "System        ";
        cout.setf(ios::left);
        cout.width(29);
        int state = systemstatus.SystemOpState;
        string extraInfo = " ";
        bool bRollback = false;
        bool bForce = false;

        if (dbrm.isDBRMReady())
        {
            if (dbrm.getSystemSuspended() > 0)
            {
                extraInfo = " WRITE SUSPENDED";
            }
            else if (dbrm.getSystemSuspendPending(bRollback) > 0)
            {
                extraInfo = " WRITE SUSPEND PENDING";
            }
            else if (dbrm.getSystemShutdownPending(bRollback, bForce) > 0)
            {
                extraInfo = " SHUTDOWN PENDING";
            }
        }

        printState(state, extraInfo);
        cout.width(24);
        string stime = systemstatus.StateChangeDate;
        stime = stime.substr (0, 24);
        cout << stime << endl << endl;

        for ( unsigned int i = 0 ; i < systemstatus.systemmodulestatus.modulestatus.size(); i++)
        {
            if ( systemstatus.systemmodulestatus.modulestatus[i].Module.empty() )
                // end of list
                break;

            cout << "Module ";
            cout.setf(ios::left);
            cout.width(7);
            cout << systemstatus.systemmodulestatus.modulestatus[i].Module;
            cout.width(29);
            state = systemstatus.systemmodulestatus.modulestatus[i].ModuleOpState;

            // get NIC functional state (degraded or not)
            bool degraded = false;

            try
            {
                int state;
                oam.getModuleStatus(systemstatus.systemmodulestatus.modulestatus[i].Module, state, degraded);
            }
            catch (...)
            {}

            string nicFun = " ";

            if (degraded)
                nicFun = "/" + DEGRADEDSTATE;

            printState(state, nicFun);

            cout.width(24);
            string stime = systemstatus.systemmodulestatus.modulestatus[i].StateChangeDate ;
            stime = stime.substr (0, 24);
            cout << stime << endl;
        }

        cout << endl;

        if ( systemstatus.systemmodulestatus.modulestatus.size() > 1)
        {
            // get and display Parent OAM Module
            cout << "Active Parent OAM Performance Module is '" << getParentOAMModule() << "'" << endl;

            //display Primary UM Module
            string PrimaryUMModuleName;

            try
            {
                oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
            }
            catch (...) {}

            if ( serverInstallType != oam::INSTALL_COMBINE_DM_UM_PM )
            {
                ModuleTypeConfig moduletypeconfig;

                try
                {
                    oam.getSystemConfig("um", moduletypeconfig);
                }
                catch (...)
                {}

                if ( moduletypeconfig.ModuleCount > 1 )
                {
                    if ( PrimaryUMModuleName != oam::UnassignedName )
                        cout << "Primary Front-End MariaDB ColumnStore Module is '" << PrimaryUMModuleName << "'" << endl;
                }
            }
            else
            {
                if ( PrimaryUMModuleName != oam::UnassignedName )
                    cout << "Primary Front-End MariaDB ColumnStore Module is '" << PrimaryUMModuleName << "'" << endl;
            }
        }

        //display local Query / PMwithUM feature, if enabled
        string PMwithUM;

        try
        {
            oam.getSystemConfig("PMwithUM", PMwithUM);
        }
        catch (...) {}

        if ( PMwithUM == "y" )
            cout << "Local Query Feature is enabled" << endl;

        //display MySQL replication feature, if enabled
        string MySQLRep;

        try
        {
            oam.getSystemConfig("MySQLRep", MySQLRep);
        }
        catch (...) {}

        if ( MySQLRep == "y" )
            cout << "MariaDB ColumnStore Replication Feature is enabled" << endl;

		//display Distributed Install feature
        if ( SingleServerInstall == "n" )
        {
			string DistributedInstall;

			try
			{
				oam.getSystemConfig("DistributedInstall", DistributedInstall);
				
				if ( DistributedInstall == "y" )
					cout << "MariaDB ColumnStore set for Distributed Install" << endl;
				else
					cout << "MariaDB ColumnStore set for Non-Distributed Install" << endl;
			}
			catch (...) {}
			
			cout << endl;
		}
    }
    catch (exception& e)
    {
        cout << endl << "**** printSystemStatus Failed =  " << e.what() << endl;
        throw runtime_error("");
    }
}

/******************************************************************************************
 * @brief	printProcessStatus
 *
 * purpose:	get and Display Process Statuses
 *
 ******************************************************************************************/
void printProcessStatus(std::string port)
{
    SystemProcessStatus systemprocessstatus;
    ProcessStatus processstatus;
    ModuleTypeConfig moduletypeconfig;
    Oam oam;
    BRM::DBRM dbrm(true);

    int state;
    string extraInfo = " ";
    bool bRollback = false;
    bool bForce = false;
    bool bSuspend = false;

    if (dbrm.isDBRMReady())
    {
        if (dbrm.getSystemSuspended() > 0)
        {
            bSuspend = true;
            extraInfo = "WRITE_SUSPEND";
        }
        else if (dbrm.getSystemSuspendPending(bRollback) > 0)
        {
            bSuspend = true;

            if (bRollback)
            {
                extraInfo = "ROLLBACK";
            }
            else
            {
                extraInfo = "SUSPEND_PENDING";
            }
        }
        else if (dbrm.getSystemShutdownPending(bRollback, bForce) > 0)
        {
            bSuspend = true;

            if (bRollback)
            {
                extraInfo = "ROLLBACK";
            }
            else
            {
                extraInfo = "SHUTDOWN_PENDING";
            }
        }
    }

    cout << endl << "MariaDB ColumnStore Process statuses" << endl << endl;
    cout << "Process             Module    Status            Last Status Change        Process ID" << endl;
    cout << "------------------  ------    ---------------   ------------------------  ----------" << endl;

    try
    {
        oam.getProcessStatus(systemprocessstatus, port);

        string prevModule = systemprocessstatus.processstatus[0].Module;

        for ( unsigned int i = 0 ; i < systemprocessstatus.processstatus.size(); i++)
        {
            if ( prevModule != systemprocessstatus.processstatus[i].Module)
                cout << endl;	//added a space line between different modules

            cout.setf(ios::left);
            cout.width(20);
            cout << systemprocessstatus.processstatus[i].ProcessName;
            cout.width(10);
            cout << systemprocessstatus.processstatus[i].Module;
            cout.width(18);
            state = systemprocessstatus.processstatus[i].ProcessOpState;

            // For these processes, if state is ACTIVE and we're in write
            // suspend, then we want to display the extra data instead of state.
            // Otherwise, we ignore extra data and display state.
            if (state == ACTIVE && bSuspend &&
                    (   systemprocessstatus.processstatus[i].ProcessName == "DMLProc"
                        || systemprocessstatus.processstatus[i].ProcessName == "DDLProc"
                        || systemprocessstatus.processstatus[i].ProcessName == "WriteEngineServer"))
            {
                printState(LEAVE_BLANK, extraInfo);
            }
            else
            {
                state = systemprocessstatus.processstatus[i].ProcessOpState;
                printState(state, " ");
            }

            cout.width(24);
            string stime = systemprocessstatus.processstatus[i].StateChangeDate ;
            stime = stime.substr (0, 24);
            cout << stime;

            if ( state == COLD_STANDBY )
            {
                cout << endl;
                continue;
            }
            else
            {
                cout.setf(ios::right);
                cout.width(12);

                if ( systemprocessstatus.processstatus[i].ProcessID != 0 )
                    cout << systemprocessstatus.processstatus[i].ProcessID << endl;
                else
                    cout << endl;
            }

            cout.unsetf(ios::right);

            prevModule = systemprocessstatus.processstatus[i].Module;

        }
    }
    catch (exception& e)
    {
        cout << endl << "**** printProcessStatus Failed =  " << e.what() << endl;
        throw runtime_error("");
    }
}

/******************************************************************************************
 * @brief	printModuleCpuUsers
 *
 * purpose:	get and Display Module TOP CPU users
 *
 ******************************************************************************************/
void printModuleCpuUsers(TopProcessCpuUsers topprocesscpuusers)
{
    cout << "Module '" + topprocesscpuusers.ModuleName + "' Top CPU Users" << endl << endl;
    cout << "Process             CPU Usage %" << endl;
    cout << "-----------------   -----------" << endl;

    for ( unsigned int i = 0 ; i < topprocesscpuusers.processcpuuser.size(); i++)
    {
        cout.setf(ios::left);
        cout.width(25);
        cout << topprocesscpuusers.processcpuuser[i].ProcessName;
        cout.width(10);
        cout << topprocesscpuusers.processcpuuser[i].CpuUsage << endl;
    }

    cout << endl;
}

/******************************************************************************************
 * @brief	printModuleCpu
 *
 * purpose:	get and Display Module CPU Usage
 *
 ******************************************************************************************/
void printModuleCpu(ModuleCpu modulecpu)
{
    Oam oam;

    cout << endl << "Module '" + modulecpu.ModuleName + "' CPU Usage % = " + oam.itoa(modulecpu.CpuUsage) << endl;
}

/******************************************************************************************
 * @brief	printModuleMemoryUsers
 *
 * purpose:	get and Display Module TOP Memory users
 *
 ******************************************************************************************/
void printModuleMemoryUsers(TopProcessMemoryUsers topprocessmemoryusers)
{
    cout << "Module '" + topprocessmemoryusers.ModuleName + "' Top Memory Users (in bytes)" << endl << endl;
    cout << "Process             Memory Used  Memory Usage %" << endl;
    cout << "-----------------   -----------  --------------" << endl;

    for ( unsigned int i = 0 ; i < topprocessmemoryusers.processmemoryuser.size(); i++)
    {
        cout.setf(ios::left);
        cout.width(20);
        cout << topprocessmemoryusers.processmemoryuser[i].ProcessName;
        cout.width(19);
        cout << topprocessmemoryusers.processmemoryuser[i].MemoryUsed;
        cout.width(3);
        cout << topprocessmemoryusers.processmemoryuser[i].MemoryUsage << endl;
    }

    cout << endl;
}

/******************************************************************************************
 * @brief	printModuleMemory
 *
 * purpose:	get and Display Module Memory Usage
 *
 ******************************************************************************************/
void printModuleMemory(ModuleMemory modulememory)
{
    Oam oam;
    cout.setf(ios::left);
    cout.width(8);
    cout << modulememory.ModuleName;
    cout.width(11);
    cout << oam.itoa(modulememory.MemoryTotal);
    cout.width(10);
    cout << oam.itoa(modulememory.MemoryUsed);
    cout.width(13);
    cout << oam.itoa(modulememory.cache);
    cout.width(9);
    cout << oam.itoa(modulememory.MemoryUsage);
    cout.width(12);
    cout << oam.itoa(modulememory.SwapTotal);
    cout.width(16);
    cout << oam.itoa(modulememory.SwapUsed);
    cout.width(7);
    cout << oam.itoa(modulememory.SwapUsage);
    cout << endl;
}

/******************************************************************************************
 * @brief	printModuleDisk
 *
 * purpose:	get and Display Module disk usage
 *
 ******************************************************************************************/
void printModuleDisk(ModuleDisk moduledisk)
{
    Oam oam;

    cout << "Module '" + moduledisk.ModuleName + "' Disk Usage (in 1K blocks)" << endl << endl;
    cout << "Mount Point                    Total Blocks  Used Blocks   Usage %" << endl;
    cout << "-----------------------------  ------------  ------------  -------" << endl;

    string etcdir = installDir + "/etc";

    for ( unsigned int i = 0 ; i < moduledisk.diskusage.size(); i++)
    {
        //skip mounts to other server disk
        if ( moduledisk.diskusage[i].DeviceName.find("/mnt", 0) == string::npos &&
                moduledisk.diskusage[i].DeviceName.find(etcdir, 0) == string::npos )
        {
            cout.setf(ios::left);
            cout.width(31);

            if (moduledisk.diskusage[i].DeviceName.length() > 29)
            {
                cout << "..." + moduledisk.diskusage[i].DeviceName.substr(moduledisk.diskusage[i].DeviceName.length() - 26);
            }
            else
            {
                cout << moduledisk.diskusage[i].DeviceName;
            }

            cout.width(14);
            cout << moduledisk.diskusage[i].TotalBlocks;
            cout.width(17);
            cout << moduledisk.diskusage[i].UsedBlocks;
            cout.width(2);
            cout << moduledisk.diskusage[i].DiskUsage << endl;
        }
    }

    cout << endl;
}

/******************************************************************************************
 * @brief	printModuleResources
 *
 * purpose:	get and Display Module resource usage
 *
 ******************************************************************************************/
void printModuleResources(TopProcessCpuUsers topprocesscpuusers, ModuleCpu modulecpu, TopProcessMemoryUsers topprocessmemoryusers, ModuleMemory modulememory, ModuleDisk moduledisk)
{
    Oam oam;
    string etcdir = installDir + "/etc";

    cout << endl << "Module '" + topprocesscpuusers.ModuleName + "' Resource Usage" << endl << endl;

    cout << "CPU: " + oam.itoa(modulecpu.CpuUsage) << "% Usage" << endl;

    cout << "Mem:  " << oam.itoa(modulememory.MemoryTotal) << "k total, " << oam.itoa(modulememory.MemoryUsed);
    cout << "k used, " << oam.itoa(modulememory.cache) << "k cache, " << oam.itoa(modulememory.MemoryUsage) << "% Usage" << endl;
    cout << "Swap: " << oam.itoa(modulememory.SwapTotal) << " k total, " << oam.itoa(modulememory.SwapUsed);
    cout << "k used, " << oam.itoa(modulememory.SwapUsage) << "% Usage" << endl;

    cout << "Top CPU Process Users: ";

    for ( unsigned int i = 0 ; i < topprocesscpuusers.processcpuuser.size(); i++)
    {
        cout << topprocesscpuusers.processcpuuser[i].ProcessName << " ";
        cout << topprocesscpuusers.processcpuuser[i].CpuUsage;

        if ( i + 1 != topprocesscpuusers.processcpuuser.size() )
            cout << "%, ";
        else
            cout << "%";
    }

    cout << endl;

    cout << "Top Memory Process Users: ";

    for ( unsigned int i = 0 ; i < topprocessmemoryusers.processmemoryuser.size(); i++)
    {
        cout << topprocessmemoryusers.processmemoryuser[i].ProcessName << " ";
        cout << topprocessmemoryusers.processmemoryuser[i].MemoryUsage;

        if ( i + 1 != topprocessmemoryusers.processmemoryuser.size() )
            cout << "%, ";
        else
            cout << "%";
    }

    cout << endl;

    cout << "Disk Usage: ";

    for ( unsigned int i = 0 ; i < moduledisk.diskusage.size(); i++)
    {
        //skip mounts to other server disk
        if ( moduledisk.diskusage[i].DeviceName.find("/mnt", 0) == string::npos &&
                moduledisk.diskusage[i].DeviceName.find(etcdir, 0) == string::npos )
        {
            cout << moduledisk.diskusage[i].DeviceName << " ";
            cout << moduledisk.diskusage[i].DiskUsage;

            if ( i + 1 != moduledisk.diskusage.size() )
                cout << "%, ";
            else
                cout << "%";
        }
    }

    cout << endl << endl;
}

/******************************************************************************************
 * @brief	printModuleResources
 *
 * purpose:	get and Display Module resource usage
 *
 ******************************************************************************************/
void printState(int state, std::string addInfo)
{
    switch (state)
    {
        case MAN_OFFLINE:
            cout << MANOFFLINE + addInfo;
            break;

        case AUTO_OFFLINE:
            cout << AUTOOFFLINE + addInfo;
            break;

        case MAN_INIT:
            cout << MANINIT + addInfo;
            break;

        case AUTO_INIT:
            cout << AUTOINIT + addInfo;
            break;

        case ACTIVE:
            cout << ACTIVESTATE + addInfo;
            break;

        case LEAVE_BLANK:
            cout << addInfo;
            break;

        case STANDBY:
            cout << STANDBYSTATE + addInfo;
            break;

        case FAILED:
            cout << FAILEDSTATE + addInfo;
            break;

        case UP:
            cout << UPSTATE + addInfo;
            break;

        case DOWN:
            cout << DOWNSTATE + addInfo;
            break;

        case COLD_STANDBY:
            cout << COLDSTANDBYSTATE + addInfo;
            break;

        case INITIAL:
            cout << INITIALSTATE + addInfo;
            break;

        case MAN_DISABLED:
            cout << MANDISABLEDSTATE + addInfo;
            break;

        case AUTO_DISABLED:
            cout << AUTODISABLEDSTATE + addInfo;
            break;

        case STANDBY_INIT:
            cout << STANDBYINIT + addInfo;
            break;

        case BUSY_INIT:
            cout << BUSYINIT + addInfo;
            break;

        case DEGRADED:
            cout << DEGRADEDSTATE + addInfo;
            break;

        default:
            cout << INITIALSTATE + addInfo;
            break;
    }
}

/******************************************************************************************
 * @brief	checkPromptThread
 *
 * purpose:	check for exit out of repeat command
 *
 ******************************************************************************************/
static void checkPromptThread()
{
    char* pcommand = 0;

    while (true)
    {
        // check input
        pcommand = readline("");

        if (!pcommand)                          // user hit <Ctrl>-D
        {
            repeatStop = true;
            break;
        }

        free(pcommand);
        pcommand = 0;
    }

    pthread_exit(0);
    return;
}

/******************************************************************************************
 * @brief	getParentOAMModule
 *
 * purpose:	get Parent OAm Module name
 *
 ******************************************************************************************/
std::string getParentOAMModule()
{
    Oam oam;

    // Get Parent OAM module Name
    try
    {
        string parentOAMModule;
        oam.getSystemConfig("ParentOAMModuleName", parentOAMModule);
        return parentOAMModule;
    }
    catch (...)
    {
        cout << endl << "**** Failed : Failed to read Parent OAM Module Name" << endl;
        exit(-1);
    }
}

/******************************************************************************************
 * @brief	checkForDisabledModules
 *
 * purpose:	Chcek and report any modules in a disabled state
 *
 ******************************************************************************************/
bool checkForDisabledModules()
{

    SystemModuleTypeConfig systemmoduletypeconfig;
    Oam oam;

    try
    {
        oam.getSystemConfig(systemmoduletypeconfig);
    }
    catch (...)
    {
        return false;
    }

    bool found = false;
    bool dbroot = false;

    for ( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
    {
        int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;

        if ( moduleCount == 0)
            continue;

        string moduleType = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;

        DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();

        for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end(); pt++)
        {
            string moduleName = (*pt).DeviceName;

            // report DISABLED modules
            try
            {
                int opState;
                bool degraded;
                oam.getModuleStatus(moduleName, opState, degraded);

                if (opState == oam::MAN_DISABLED || opState == oam::AUTO_DISABLED)
                {
                    if (!found)
                    {
                        cout << "   NOTE: These module(s) are DISABLED: ";
                        found = true;
                    }

                    cout << moduleName << " ";

                    if ( moduleType == "um" )
                        continue;

                    //check if module has any dbroots assigned to it
                    string PMID = moduleName.substr(MAX_MODULE_TYPE_SIZE, MAX_MODULE_ID_SIZE);;
                    DBRootConfigList dbrootConfigList;

                    try
                    {
                        oam.getPmDbrootConfig(atoi(PMID.c_str()), dbrootConfigList);

                        if ( dbrootConfigList.size() != 0 )
                            dbroot = true;
                    }
                    catch (exception& e)
                    {}
                }
            }
            catch (...)
            {}
        }
    }

    if (found)
        cout << endl << endl;

    if (dbroot)
        return false;

    return true;
}

/** @brief Ask the user for cancel/wait/rollback/force
 *
 *  When a Shutdown, stop, restart or suspend operation is
 *  requested but there are active transactions of some sort,
 *  we ask the user what to do.
 */
CC_SUSPEND_ANSWER AskSuspendQuestion(int CmdID)
{
    char* szAnswer = 0;
    char* p;
    string argument = "cancel";

    const char* szCommand = "Unknown";

    switch (CmdID)
    {
        case 16:
            szCommand = "stop";
            break;

        case 17:
            szCommand = "shutdown";
            break;

        case 19:
            szCommand = "restart";
            break;

        case 28:
            szCommand = "switch parent oam";
            break;

        case 32:
            szCommand = "suspend";
            break;

        default:
            return CANCEL;
            break;
    }

    cout << "Your options are:" << endl
         << "    Cancel    -- Cancel the " << szCommand << " request" << endl
         << "    Wait      -- Wait for write operations to end and then " << szCommand << endl;

//		 << "    Rollback  -- Rollback all transactions and then " << szCommand << endl;
    if (CmdID != 28 && CmdID != 32)
    {
        cout << "    Force     -- Force a " << szCommand << endl;
    }

    while (true)
    {
        argument = "cancel";
        // read input
        szAnswer = readline("What would you like to do: [Cancel]: ");

        if (szAnswer && *szAnswer)
        {
            p = strtok(szAnswer, " ");
            argument = p;
            free(szAnswer);
            szAnswer = 0;
        }

        // In case they just hit return.
        if (szAnswer)
        {
            free(szAnswer);
            szAnswer = 0;
        }

        // convert argument into lowercase
        transform(argument.begin(), argument.end(), argument.begin(), to_lower());

        if ( argument == "cancel")
        {
            return CANCEL;
        }
        else if ( argument == "wait")
        {
            return WAIT;
        }
//		else if( argument == "rollback")
//		{
//			return ROLLBACK;
//		}
        else if ( argument == "force" && (CmdID == 16 || CmdID == 17 || CmdID == 19))
        {
            return FORCE;
        }
        else
        {
            cout << argument << " is an invalid response" << endl;
        }
    }
}

// Make a connection to the PM that uses DBRoot1. Used in redistribute
// return true if successful, false if fail.
bool connectToDBRoot1PM(Oam& oam, boost::scoped_ptr<MessageQueueClient>&  msgQueueClient)
{
    int pmId = 0;
    ModuleTypeConfig moduletypeconfig;

    try
    {
        oam.getDbrootPmConfig(1, pmId);
        oam.getSystemConfig("pm", moduletypeconfig);
    }
    catch (const std::exception& ex)
    {
        cerr << "Caught exception when getting DBRoot1" << ex.what() << endl;
        return false;
    }
    catch (...)
    {
        cerr << "Caught exception when  getting DBRoot1 -- unknown" << endl;
        return false;
    }

    // Find the PM that has dbroot1, then make connection to its WES.
    ostringstream oss;
    oss << "pm" << pmId << "_WriteEngineServer";

    try
    {
        msgQueueClient.reset(new MessageQueueClient(oss.str()));
    }
    catch (const std::exception& ex)
    {
        cerr << "Caught exception when connecting to " << oss.str() << " : " << ex.what() << endl;
        return false;
    }
    catch (...)
    {
        cerr << "Caught exception when connecting to " << oss.str() << " : unknown" << endl;
    }

    return true;
}

bool SendToWES(Oam& oam, ByteStream bs)
{
    boost::scoped_ptr<MessageQueueClient>  msgQueueClient;

    if (!connectToDBRoot1PM(oam, msgQueueClient))
        return false;

    uint32_t status = RED_STATE_UNDEF;
    msgQueueClient->write(bs);

    SBS sbs;
    sbs = msgQueueClient->read();

    if (sbs->length() == 0)
    {
        cerr << "WriteEngineServer returned an empty stream. Might be a network error" << endl;
    }
    else if (sbs->length() < 5)
    {
        cerr << "WriteEngineServer returned too few bytes. Refistribute status is unknown" << endl;
    }
    else
    {
        ByteStream::byte wesMsgId;
        *sbs >> wesMsgId;
        *sbs >> status;

        string msg;
        *sbs >> msg;
        cout << "WriteEngineServer returned status " << status << ": " << msg << endl;
    }

    return true;
}
// vim:ts=4 sw=4:

